Ответ 1
Да есть разница: is
работает с любым классом в Swift, тогда как isKindOfClass()
работает только с теми классами, которые являются подклассами NSObject
или иным образом реализует NSObjectProtocol
.
Swift предоставляет ключевое слово is
(и as?
), чтобы проверить, может ли объект успешно сбрасываться:
if foo is MyClass {
// ...
}
Но NSObjectProtocol
также предоставляет оригинальный func isKindOfClass(aClass: AnyClass!) -> Bool
:
if something.isKindOfClass(MyClass) {
// ...
}
Для классов, соответствующих NSObjectProtocol
, это действительно сильно отличается?
Да есть разница: is
работает с любым классом в Swift, тогда как isKindOfClass()
работает только с теми классами, которые являются подклассами NSObject
или иным образом реализует NSObjectProtocol
.
Некоторые отличия:
is
работает с неклассическими типами. isKindOfClass:
работает только с объектами, чтобы проверить, являются ли они экземпляром классаisKindOfClass:
объявляется на NSObjectProtocol
, поэтому он не позволит вам использовать его в выражениях, которые, как известно, не находятся в этом протоколе, кроме AnyObject
. Собственные классы Swift также (неофициально) соответствуют NSObjectProtocol
, поэтому, если вы добавите их в AnyObject
, вы можете использовать isKindOfClass
: (something as AnyObject).isKindOfClass(MyClass)
is
также работает для проверки протоколов, тогда как эквивалент в терминах методов NSObjectProtocol
будет conformsToProtocol:
is
принимает тип, который должен быть жестко закодирован во время компиляции. isKindOfClass:
принимает выражение, значение которого может быть вычислено во время выполнения. Я не знаю, как проверить, является ли объект экземпляром класса (включая подклассы), который вычисляется во время выполнения, используя только стандартную библиотеку Swift.В 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
}