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

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

if foo is MyClass {
    // ...
}

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

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

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

35 голосов | спросил jtbandes 22 J000000Tuesday14 2014, 05:48:25

3 ответа


0

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

ответил Tomasz Sętkowski 17 52017vEurope/Moscow11bEurope/MoscowFri, 17 Nov 2017 17:29:51 +0300 2017, 17:29:51
0

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

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

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

Вы можете проверить, принадлежит ли экземпляр определенному типу подкласса, используя оператор 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

ответил Nathan Hegedus 10 WedEurope/Moscow2014-12-10T19:42:35+03:00Europe/Moscow12bEurope/MoscowWed, 10 Dec 2014 19:42:35 +0300 2014, 19:42:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132