web-dev-qa-db-fra.com

UIView isKindOfClass dans Swift 3

J'ai donc ce code:

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

Cela a bien fonctionné dans Swift 2, mais maintenant que je suis dans Swift 3, je reçois cette erreur:

La valeur de type UIView n'a pas de membre isKindOfClass

Comment puis-je tester cela dans Swift 3?

16
Steven Jacks

Vous pouvez essayer avec ces trois options dans Swift:

Option 1:

if view is UITabBarItem {

}

Option 2:

if view.isKind(of:UITabBarItem.self) {

}

Option 3:

if view.isMember(of:UITabBarItem.self) {

}

La différence entre isKind: of et isMember: of est:

  • isKind: of renvoie YES si le récepteur est une instance de la classe exacte, OR si le récepteur est une instance de n'importe quelle sous-classe de la classe.
  • isMember: of only renvoie YES si le récepteur est une instance de la classe exacte contre laquelle vous vérifiez
36
Marlon Ruiz

Vous pouvez utiliser isKind(of:) mais il vaut mieux utiliser les plus swifty is et as:

Voir un exemple stupide:

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)

Exécutez le code dans une aire de jeux et la sortie sera:

p: Base
    Not X
p: SuperX
    Super X
p: X
    X
    Super X
p: hey
    Unacceptable
p: Y
    Unacceptable
p: 7
    Unacceptable
7
djromero

Utilisez simplement l'opérateur is pour vérifier comme

if view is UITableViewCell { 
  //do something
}

ou

guard view is UITableViewCell else {
  return
}
//do something

si vous devez utiliser la vue comme instance de type de classe, utilisez l'opérateur as pour le cast:

if let view = view as? UITableViewCell {
  //here view is a UITableViewCell
}

ou

guard let view = view as? UITableViewCell else {
  return
}
//here view is a UITableViewCell
1
Giuseppe Travasoni

Casting de type Swift isas

pré-requis

class MediaItem {}
class Movie: MediaItem {}
class Song: MediaItem {}

var mediaItem = MediaItem()
let movie = Movie()
let song = Song()

is - l'opérateur est utilisé pour vérifier (retourne vrai ou faux) le type d'une instance. is remplace isKind(of:) alias isKindOfClass. is fonctionne avec n'importe quelle classe dans Swift, tandis que isKind(of:) ne fonctionne qu'avec les classes qui sont des sous-classes de NSObject ou implémentent autrement NSObjectProtocol ( alors répondez )

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 - l'opérateur est utilisé pour convertir l'instance en un autre type.

Une constante ou une variable d'un certain type de classe peut en fait faire référence à une instance d'une sous-classe dans les coulisses. Si vous pensez que c'est le cas, vous pouvez essayer de abattre vers le type de sous-classe avec un opérateur de transtypage de type (as? Ou 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
}

Pour comprendre le type, utilisez la méthode type(of:)

mediaItem = movie
print("type of mediaItem:\(type(of: mediaItem))") //type of mediaItem:Movie

De plus, ils is et as? Sont sûrs pour nil vérification

En savoir plus ici

0
yoAlex5