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?
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:
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
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
Casting de type Swift is
as
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