【发布时间】:2015-04-25 15:33:48
【问题描述】:
我有一个带有属性的类,该属性应该具有在其他语言中称为通用(或模板)接口的类型。当我试图在 Swift 中模仿这种行为时,我无法让协议与这个想法一起工作。例如:
protocol P {
typealias T
func returnT() -> T
}
class G<T>: P {
var t: T
init(t: T) {
self.t = t
}
func returnT() -> T {
return t
}
}
class C {
var p: P<Int> // Cannot specialize non-generic type 'P'
init(instanceOfP: P<Int>) { // Cannot specialize non-generic type 'P'
p = instanceOfP
}
func usePsT() -> Int {
return p.returnT() // 'P' does not have a member named 'returnT'
}
}
来自编译器的错误报告为 cmets。在我看来,这种情况应该没有问题:但由于 Swift 的协议不能是泛型(他们使用这种晦涩的 typealias 语法代替)C 无法知道实现 P 的每个类都可以专门用于Int。是否有一种 Swift-y 方式来正确表示这种情况?或者是否有任何已知的解决方法,这样我就不必强制或去概括类结构?
【问题讨论】:
-
不幸的是,至少目前 Swift 的协议不支持泛型类型参数。只允许关联类型,以使它们通用。我一直认为这很不方便。
标签: swift templates generics interface protocols