que instanciar inicializadores función estructura entrada datos computadas clase arrays swift protocols

arrays - instanciar - La extensión de tipo Array con restricciones no puede tener una cláusula de herencia-swift 2



que es self en swift (2)

¿Qué tal un pequeño borrado de tipo? Deberia hacer la garrapata

protocol JSONDecodable { init(json: JSON) throws }

Mientras que Swift 3 no permite hacer como extensión

extension Array: JSONDecodable where Element: JSONDecodable

pero es posible hacer:

extension Array: JSONDecodable { init(json: JSON) throws { guard let jsonArray = json.array, let decodable = Element.self as? JSONDecodable.Type else { throw JSONDecodableError.undecodable } self = jsonArray.flatMap { json in let result: Element? = (try? decodable.init(json: json)) as? Element return result } } }

En Swift 2 quiero extender el tipo de Array. Tengo un protocolo JSONDecodable . Lo que quiero decir al compilador es que cumpla con Array to protocol JSONDecodable si los elementos de Array también son JSONDecodable . Aquí está el código:

public protocol JSONDecodable { static func createFromJSON(json: [String: AnyObject]) throws -> Self } extension Array: JSONDecodable where Element: JSONDecodable { }

Pero el compilador da el error: "La extensión de tipo Array con restricciones no puede tener una cláusula de herencia"

Entonces, ¿hay alguna otra manera de lograr este tipo de comportamiento?


Creo que la pista que encontraste en Twitter significa algo así:

protocol X { var xxx: String { get } } // This is a wrapper struct struct XArray: X { let array: Array<X> var xxx: String { return "[/(array.map({ $0.xxx }).joinWithSeparator(", "))]" } } // Just for this demo extension String: X { var xxx: String { return "x/(self)" } } let xs = XArray(array: ["a", "b", "c"]) print(xs.array) // ["a", "b", "c"] print(xs.xxx) // [xa, xb, xc]