【发布时间】:2014-08-02 04:56:03
【问题描述】:
我正在尝试使用以下函数扩展 Swift 的 Array 类:
func containsObjectIdenticalTo(obj: T) -> Bool {
// objectPassingTest returns the first object passing the test
return objectPassingTest { x in x == obj }
}
显然,这不会编译,因为编译器还不知道 == 是否为类型 T 实现。然后我把代码改成这个
func containsObjectIdenticalTo(obj: T) -> Bool {
return objectPassingTest {
x in
assert(x is Equatable && obj is Equatable)
return (x as Equatable) == (obj as Equatable)
} != nil
}
这也不起作用,因为无法检查与 Equatable 的一致性(因为 Equatable 未使用 @obj 定义)!
对此有什么想法吗?如果T符合Equatable,如果有某种方法可以直接断言会很好,但我还没有在任何地方读过。在这些方面,Swift 似乎不如 Obj-C 动态。
更新:
尝试了这个建议,但它不起作用(不知道 <T: Equatable> 的确切用途,但它确实可以编译)。
func containsObjectIdenticalTo<T: Equatable>(obj: T) -> Bool {
var x = self[0]
var y = self[0]
return x == y // Error here
}
【问题讨论】:
-
这看起来很奇怪。您是在编写通用代码并且没有发布所有代码,还是 T 是在某处定义的类型?
-
T是一个类型别名,在Array结构中定义。查看 Swift 声明文件。