Swift中泛型的身份比较

时间:2015-04-01 03:58:15

标签: swift

我想知道我是否以及如何对泛型类的实例进行身份比较。例如:

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操作数

3 个答案:

答案 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>以确保Tclass

答案 1 :(得分:0)

我建议将通用的类型限制为Comparable协议。

class Foo<T: Comparable> {...}

enter image description here

答案 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