Подтвердить что ты не робот

Есть ли разница между "is" и isKindOfClass()?

Swift предоставляет ключевое слово isas?), чтобы проверить, может ли объект успешно сбрасываться:

if foo is MyClass {
    // ...
}

Но NSObjectProtocol также предоставляет оригинальный func isKindOfClass(aClass: AnyClass!) -> Bool:

if something.isKindOfClass(MyClass) {
    // ...
}

Для классов, соответствующих NSObjectProtocol, это действительно сильно отличается?

4b9b3361

Ответ 1

Да есть разница: is работает с любым классом в Swift, тогда как isKindOfClass() работает только с теми классами, которые являются подклассами NSObject или иным образом реализует NSObjectProtocol.

Ответ 2

Некоторые отличия:

  • is работает с неклассическими типами. isKindOfClass: работает только с объектами, чтобы проверить, являются ли они экземпляром класса
  • Как уже упоминалось другими, isKindOfClass: объявляется на NSObjectProtocol, поэтому он не позволит вам использовать его в выражениях, которые, как известно, не находятся в этом протоколе, кроме AnyObject. Собственные классы Swift также (неофициально) соответствуют NSObjectProtocol, поэтому, если вы добавите их в AnyObject, вы можете использовать isKindOfClass: (something as AnyObject).isKindOfClass(MyClass)
  • is также работает для проверки протоколов, тогда как эквивалент в терминах методов NSObjectProtocol будет conformsToProtocol:
  • is принимает тип, который должен быть жестко закодирован во время компиляции. isKindOfClass: принимает выражение, значение которого может быть вычислено во время выполнения. Я не знаю, как проверить, является ли объект экземпляром класса (включая подклассы), который вычисляется во время выполнения, используя только стандартную библиотеку Swift.

Ответ 3

В Objective-C вы используете метод isKindOfClass: для проверки того, является ли объект определенным типом класса, и метод matchingsToProtocol: для проверки соответствия объекта указанному протоколу. В Swift вы выполняете эту задачу, используя оператор is для проверки типа, или как? оператора для перехода к этому типу.

Вы можете проверить, является ли экземпляр определенного типа подкласса с помощью оператора is. Оператор is возвращает true, если экземпляр относится к типу подкласса, а false, если это не так.

СВИФТ

if object is UIButton {
    // object is of type UIButton
} else {
    // object is not of type UIButton
}

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html