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

UIView isKindOfClass в Swift 3

Итак, у меня есть этот код:

if view.isKindOfClass(classType){...}

Это отлично работало в Swift 2, но теперь, когда я нахожусь в Swift 3, я получаю эту ошибку:

Значение типа UIView не имеет члена isKindOfClass

Как проверить это в Swift 3?

4b9b3361

Ответ 1

Вы можете попробовать с этими тремя параметрами в 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: возвращает YES, если получатель является экземпляром точного класса, ИЛИ если получатель является экземпляром любого подкласса класса.
  • isMember: только возвращает YES, если ресивер является экземпляром точного класса, который вы проверяете против

Ответ 2

Вы можете использовать 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

Ответ 3

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 проверки

Узнайте больше здесь

Ответ 4

Просто используйте 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