2015-09-10 2 views
0

Невозможно ли в Swift сравнить идентификацию объекта с типом протокола? Я пытаюсь найти встроенный способ сделать это. Это мой пример:Идентификация объекта и протоколы

protocol MyProtocol { 
    var propertyFoo: Int { get set } 
} 

class MyProtocolImpl: MyProtocol { 
    var propertyFoo = 100 

    func test(arg: MyProtocol) { 
    if arg === self {    // error 
     print("Same object") 
    } else { 
     print("Different object") 
    } 
    } 
} 

Я получаю следующее сообщение об ошибке:

Бинарный оператор '===' не может быть применен к операндам типа 'MyProtocol' и 'MyProtocolImpl'

+1

Похоже, он должен быть опущенными с: ', если аргумент является MyProtocolImpl && АРГ! MyProtocolImpl === self' –

+0

Да, вы правы)) – Avt

ответ

0

Чтобы сравнить идентификатор объекта, операнды должны быть ссылочными типами.

Поэтому вы должны объявить MyProtocol как протокол class. Попробуйте:

protocol MyProtocol: class { 
//     ^^^^^^^ 
    var propertyFoo: Int { get set } 
} 

ИЛИ Если MyProtocol может быть также реализован с помощью struct или enum, сравните с условным downcasted объектом.

if arg as? MyProtocolImpl === self { 
// ^^^^^^^^^^^^^^^^^^^ 

Это работает, потому что === принимает Optional параметры.

func ===(lhs: AnyObject?, rhs: AnyObject?) -> Bool 
+0

Все еще обучение Swift. Протоколы только для классов были недостающим звеном. Благодаря! –