我正在尝试使用以下函数扩展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
的某种方式可以直接断言,那会很好,但我无法在任何地方阅读。在这些东西中,斯威夫特似乎没有Obj-C那么动态。
更新
尝试过这个建议而且它没有用(不确切知道<T: Equatable>
是什么,而是编译)。
func containsObjectIdenticalTo<T: Equatable>(obj: T) -> Bool {
var x = self[0]
var y = self[0]
return x == y // Error here
}
答案 0 :(得分:4)
指定T必须在Method&#39签名中是等号:
func containsObjectIdenticalTo<T: Equatable>(obj: T) -> Bool {/*...*/}
答案 1 :(得分:2)
我从ExSwift得到了这个:https://github.com/pNre/ExSwift
func contains <T: Equatable> (items: T...) -> Bool {
return items.all { self.indexOf($0) >= 0 }
}
func indexOf <U: Equatable> (item: U) -> Int? {
if item is Element {
if let found = find(reinterpretCast(self) as Array<U>, item) {
return found
}
return nil
}
return nil
}
func all (call: (Element) -> Bool) -> Bool {
for item in self {
if !call(item) {
return false
}
}
return true
}
也许你可以尝试一下
答案 2 :(得分:1)
怎么样:
func containsObjectIdenticalTo<T : Equatable>(obj: T) -> Bool {
... etc ...
}
答案 3 :(得分:1)
最后,我采用了这个解决方案
func containsObjectIdenticalTo<U: Equatable>(obj: U) -> Bool {
return objectPassingTest({
x in
return x as U == obj
}) != nil
}
可能不是最好的(即最安全的)。但它很有效。