在swift 2中我想扩展Array类型。我有一个JSONDecodable
协议。如果Array
的元素也是JSONDecodable
,我想对编译器说的是Array
到协议JSONDecodable
。这是代码:
public protocol JSONDecodable {
static func createFromJSON(json: [String: AnyObject]) throws -> Self
}
extension Array: JSONDecodable where Element: JSONDecodable {
}
但是编译器给出了错误:“带有约束的类型Array的扩展不能有继承子句”
还有其他方法可以实现这种行为吗?
答案 0 :(得分:7)
小型擦除怎么样?它应该打勾
protocol JSONDecodable {
init(json: JSON) throws
}
虽然Swift 3不允许做类似扩展
extension Array: JSONDecodable where Element: JSONDecodable
但可以做到:
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
}
}
}
答案 1 :(得分:0)
我认为你在Twitter上找到的the hint意味着类似的东西:
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]