2015-06-19 7 views
3

У меня есть класс Objective-C (который является кнопкой, но это не важно), а в другой части моего (смешанного языка) проекта у меня есть массив этих кнопок, и я хотел бы получить указатель кнопки с использованием метода find(). Как так:Как сделать класс Objective-C совместимым с Swift `Equatable`?

func doSomethingWithThisButtonIndex(index:Int) 
{ 
    let buttons = [firstButton, secondButton, thirdButton] 
    if index == find(buttons, firstButton) 
    { 
     // we've selected the first button 
    } 
} 

, но я получаю

Тип 'ImplicitlyUnwrappedOptional' не соответствует протоколу equatable

Ладно, давайте идти на Objective-C и имеют ButtonThing реализация <Equatable>. Но это не признает.

Так что мне делать? Пока я строю вокруг него, заставляя массив быть NSArray и используя indexOfObject. Но это уродливо. И расстраивает.

+0

Если мой ответ вас не удовлетворяет, тогда единственный ответ - «Это невозможно». Вы не можете сделать класс Objective-C соответствующим протоколу Swift, если протокол не будет аннотирован как '@ objc', или если вы сделаете это с конца Swift. «Equatable» не аннотируется как таковой, и он не может иметь смысла, чтобы он был так аннотирован. – nhgrif

ответ

9

Во-первых, в Swift написать пользовательскую функцию == для вашего класса.

Во-вторых, также в Swift, напишите расширение класса, которое добавит соответствие протокола Equatable.

Может быть, к примеру:

func == (lhs: YourClass, rhs: YourClass) -> Bool { 
    // whatever logic necessary to determine whether they are equal 
    return lhs === rhs 
} 

extension YourClass: Equatable {} 

А теперь ваш класс соответствует Equatable, что Swift специфичны. Вы не можете сделать это на конце Objective-C, потому что вы не можете писать пользовательские операторы для Objective-C.

+1

@Yerk Прочитайте последнюю строку ответа. Вы не можете сделать это для Objective-C. Для Swift 'Equatable' требуется специальный пользователь (в частности,' == '), и нет никакого способа сделать это с Objective-C. Возможно, что более важно, вы должны пытаться сделать это для Objective-C в любом случае. Objective-C '==' эквивалентен Swift '===' для ссылок на объекты. Мы не должны изменять это 30-летнее поведение Objective-C ... – nhgrif

+1

Кроме того, протокол «Equatable» не определяется как протокол '@ objc', поэтому протокол не может использоваться из Objective- C вообще. 'Equatable' - это ** чисто ** протокол Swift. Способ создания класса Objective-C соответствует этому протоколу - это расширение класса из Swift. Ничто другое не имеет смысла. Вы действительно спрашиваете: «Как я могу переопределить поведение по умолчанию' == 'в Objective-C?» – nhgrif

+0

- это то, что опечатка «===» 3 равна знакам ??? – Alix

0

Если Objective класс C является NSObject, реализовать IsEqual:

- (BOOL)isEqual:(_Nullable id)other; 

Это работало для меня Array.index (из: MyObject) и == сравнений. NSObject уже Equatable, поэтому использование расширения Swift не работает.

 Смежные вопросы

  • Нет связанных вопросов^_^