我想知道我是否以及如何对泛型类的实例进行身份比较。例如:
class Foo<T> {
let a: T
let b: T
init(a: T, b: T) {
self.a = a
self.b = b
}
func isIdentical() -> Bool {
return a === b
}
}
做类似的事情在编译时给我一个错误:
二元运算符&#39; ===&#39;不能应用于两个T操作数
答案 0 :(得分:2)
这应该有效:
class Foo<T: AnyObject> {
// ^^^^^^^^^^^ ADDED
let a: T
let b: T
init(a: T, b: T) {
self.a = a
self.b = b
}
func isIdentical() -> Bool {
return a === b
}
}
您需要<T: AnyObject>
以确保T
为class
。
答案 1 :(得分:0)
我建议将通用的类型限制为Comparable协议。
class Foo<T: Comparable> {...}
答案 2 :(得分:0)
身份检查仅适用于AnyObject类型,不适用于所有类型。我认为在Swift中你不能对像Int这样的基本数据类型进行身份检查,因为它不符合AnyObject。
由于未知通用类型Foo中的类型T确认AnyObject身份,因此无法应用身份检查。您可以放置通用限制,使其像这样工作:
class Foo<T: AnyObject> {
let a: T
let b: T
init(a: T, b: T) {
self.a = a
self.b = b
}
func isIdentical() -> Bool {
return a === b
}
}
class SomeClass {
}
var so = SomeClass()
var a = Foo<SomeClass>(a: SomeClass(), b: SomeClass())
var b = Foo<SomeClass>(a: so, b: so)
println(a.isIdentical()) //False
println(b.isIdentical()) //True