是否可以要求泛型类型的特定实例符合Swift中的协议?
例如,假设我有一个名为Thing<T>
的泛型类型。我希望Thing<Int>
符合某个协议,但不是Thing<T>
。
答案 0 :(得分:3)
嗯,它可能不会太繁琐,而且你可能已经忽略了它,但你可以做一个'泛型类型的特定实例化' - 如下:
class ThingOfInt : Thing<Int>, SpecialIntProtocol {
// implement SpecialIntProtocol (if it isn't already
// implemented in an extension)
}
或者更具普遍性:
class IntThing<T:IntegerType> : MyThing<T>, SpecialIntProtocol {
}
答案 1 :(得分:2)
在 Swift 2.0 中,您可以扩展协议和类型
扩展它时,您可以添加通用where
约束。只有符合该规则的类型才能使用该功能
示例强>:
public struct Thing<T> {
let x: T
}
extension Thing where T : IntegerType {
func giveMeInt () -> T {
return x
}
}
let a = Thing<Int>(x: 10)
a.giveMeInt()
let b = Thing(x: 10.1)
//b.giveMeInt() // Error
这样您就可以为Thing<Int>
类型
我不知道在扩展中符合协议的方法,但它没有多大意义。
限制:通用where T :
可以与协议和类一起使用,这就是我们无法在那里指定Int的原因
答案 2 :(得分:-3)
您可以执行类似使用where
关键字的操作并传递条件。在Where子句部分https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Generics.html#//apple_ref/doc/uid/TP40014097-CH26-XID_275
class Thing<T : SomeProtocol where reflect(T).summary != "Int"> {
...
}