Итак, у меня есть этот код:
if view.isKindOfClass(classType){...}
Это отлично работало в Swift 2, но теперь, когда я нахожусь в Swift 3, я получаю эту ошибку:
Значение типа UIView
не имеет члена isKindOfClass
Как проверить это в Swift 3?
Итак, у меня есть этот код:
if view.isKindOfClass(classType){...}
Это отлично работало в Swift 2, но теперь, когда я нахожусь в Swift 3, я получаю эту ошибку:
Значение типа UIView
не имеет члена isKindOfClass
Как проверить это в Swift 3?
Вы можете попробовать с этими тремя параметрами в Swift 3:
Вариант 1:
if view is UITabBarItem {
}
Вариант 2:
if view.isKind(of:UITabBarItem.self) {
}
Вариант 3:
if view.isMember(of:UITabBarItem.self) {
}
Разница между isKind: of и isMember: of is:
Вы можете использовать isKind(of:)
, но лучше использовать более быстрые is
и as
:
См. немой пример:
import Foundation
class Base {}
class SuperX: Base {}
class X: SuperX {}
class Y {}
func f(p: Any) {
print("p: \(p)")
guard let x = p as? Base
else { return print(" Unacceptable") }
if x is X {
print(" X")
}
if x is SuperX {
print(" Super X")
}
else {
print(" Not X")
}
}
f(p: Base())
f(p: SuperX())
f(p: X())
f(p: "hey")
f(p: Y())
f(p: 7)
Запустите код на игровой площадке, а выход будет:
p: Base
Not X
p: SuperX
Super X
p: X
X
Super X
p: hey
Unacceptable
p: Y
Unacceptable
p: 7
Unacceptable
Swift Type Casting is
as
preretirements
class MediaItem {}
class Movie: MediaItem {}
class Song: MediaItem {}
var mediaItem = MediaItem()
let movie = Movie()
let song = Song()
is
- оператор используется для проверки (возвращает true или false) тип экземпляра. is
заменой isKind(of:)
aka isKindOfClass
. is
работает с любым классом в Swift, тогда как isKind(of:)
работает только с теми классами, которые являются подклассами NSObject
или иным образом реализуют NSObjectProtocol
(ответьте так)
if mediaItem is MediaItem { //true
print("mediaItem is MediaItem:\(mediaItem)") //mediaItem is MediaItem:MediaItem
}
if movie is Movie { //true
print("movie is Movie:\(movie)") //movie is Movie:Movie
}
if movie is MediaItem { //true
print("movie is MediaItem:\(movie)") //movie is MediaItem:Movie
}
if song is Movie { //false
print("song is Movie:\(song)") //IS NOT CALLED
}
Оператор as
- используется для приведения экземпляра к другому типу.
Константа или переменная определенного типа класса может фактически ссылаться на экземпляр подкласса за кулисами. Если вы считаете, что это так, вы можете попытаться выполнить переход к типу подкласса с помощью оператора приведения типа (as?
Или as!
).
if let mediaItem = mediaItem as? MediaItem { //success
print("mediaItem as MediaItem:\(mediaItem)") //mediaItem as MediaItem:MediaItem
}
if let movie = movie as? Movie { //success
print("movie as Movie:\(movie)") //movie as Movie:Movie
}
if let mediaItem = movie as? MediaItem { //success
print("movie as MediaItem:\(mediaItem)") //movie as MediaItem:Movie
}
if let song = song as? Movie { //failed
print("song as Movie:\(song)") //IS NOT CALLED
}
Чтобы выяснить тип, используйте метод type(of:)
mediaItem = movie
print("type of mediaItem:\(type(of: mediaItem))") //type of mediaItem:Movie
Также они is
и as?
безопасны для nil
проверки
Узнайте больше здесь
Просто используйте is
оператор для проверки, как
if view is UITableViewCell {
//do something
}
или же
guard view is UITableViewCell else {
return
}
//do something
если вам нужно использовать представление как экземпляр типа класса, используйте as
оператор для приведения:
if let view = view as? UITableViewCell {
//here view is a UITableViewCell
}
или же
guard let view = view as? UITableViewCell else {
return
}
//here view is a UITableViewCell