Swift2 Swift 2.2:扩展阵列以实现协议,但仅适用于特定元素类型

Swift2 Swift 2.2:扩展阵列以实现协议,但仅适用于特定元素类型,swift2,Swift2,考虑以下代码,该代码使用泛型实现工厂,只要它们实现ProtocolDataConstructed,就会创建对象: protocol ProtocolDataConstructed { init?(data: String?) } class MyObject : NSObject, ProtocolDataConstructed { required convenience init?(data: String?) { //call super's

考虑以下代码,该代码使用泛型实现工厂,只要它们实现ProtocolDataConstructed,就会创建对象:

protocol ProtocolDataConstructed {
    init?(data: String?)
}


class MyObject : NSObject, ProtocolDataConstructed {
    required convenience init?(data: String?) {
        //call super's
        self.init()
        //nothing to construct if string is invalid
        guard let data = data else { return nil }
        //do stuff here with the string to create this instance of MyObject
        //...
    }
}

class Factory {
    static func createFromJson<T : ProtocolDataConstructed> (data : String?) -> T? {
        //...
        return T(data : data)
    }
}

//Works perfectly ! :

    let myObject : MyObject? = Factory.createFromJson("sometestdatastring")
所以我希望数组实现ProtocolDataConstructed当且仅当数组中的元素本身实现ProtocolDataConstructed时

比如:

extension Array : ProtocolDataConstructed where Element == ProtocolDataConstructed {
        required convenience init?(data: String?) {
...
    }
}
但是,这会导致以下错误:

Extension of type 'Array' with constraints cannot have an inheritance clause
Same-type requirement makes generic parameter 'Element' non-generic

还有其他方法可以做到这一点吗?另一种语法可能是?

扩展数组,其中元素:ProtocolDataConstructed{}检查这个。这是你想要的吗。但这并不是说数组本身实现了ProtocolDataConstructed,只是元素必须实现,不是吗?所以这不起作用…扩展数组中的元素:ProtocolDataConstructed{…},然后让test:[MyObject]?=createFromJson(“sometestdataString”)表示“通用参数”T“无法推断”。我想这是因为我之前的评论,你建议的并没有说明数组本身实现了ProtocolDataConstructedextension数组,其中元素:ProtocolDataConstructed{}检查这个。这是你想要的吗。但这并不是说数组本身实现了ProtocolDataConstructed,只是元素必须实现,不是吗?所以这不起作用…扩展数组中的元素:ProtocolDataConstructed{…},然后让test:[MyObject]?=createFromJson(“sometestdataString”)表示“通用参数”T“无法推断”。我认为这是因为我之前的评论,您所建议的并没有说明数组本身实现了ProtocolDataConstructed
Extension of type 'Array' with constraints cannot have an inheritance clause
Same-type requirement makes generic parameter 'Element' non-generic