2015-04-01 5 views
2

Мне интересно, если и как я мог бы сравнивать идентичность экземпляров родового класса. Например:Сравнение идентичности дженериков в 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 
    } 
} 

Делать что-то подобное, что дает мне ошибку при компиляции:

бинарный оператор «===» не может быть применен к двум Т операндами

ответ

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.

0

Я бы рекомендовал ограничивать тип generic протоколом Comparable.

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

enter image description here

+0

Я специально пытаюсь проверить идентичность, а не равенство. '==' via Comparable или Equatable может проверять только на равенство. – bloudermilk

+0

Мой ответ ошибочен. –

0

проверка идентичности только для типов AnyObject, а не для всех типов. Я думаю, что в Swift у вас не было проверки подлинности для базовых типов данных, таких как Int, поскольку он не соответствует AnyObject.

Как известно, тип T в общем типе Foo не подтверждает, что проверка личности 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 
Смежные вопросы