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