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
}
}
}
Esta pregunta ya tiene una respuesta aquí:
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]