带约束的Array类型的扩展不能有继承子句 - swift 2

时间:2015-10-08 08:14:00

标签: arrays swift protocols

在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的扩展不能有继承子句”

还有其他方法可以实现这种行为吗?

2 个答案:

答案 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]