web-dev-qa-db-fra.com

Comment tester la classe d'une variable dans Swift?

Je veux vérifier si les éléments d'un tableau sont une sous-classe d'UILabel dans Swift:

import UIKit

var u1 = UILabel()
u1.text="hello"
var u2 = UIView(frame: CGRectMake(0, 0, 200, 20))
var u3 = UITableView(frame: CGRectMake(0, 20, 200, 80))

var myArray = [u1, u2, u3]

var onlyUILabels = myArray.filter({"what to put here?"})

Sans passer par l'objectif-c.

26
Carpsen90

Swift a l'opérateur is pour tester le type d'une valeur:

var onlyUILabels = myArray.filter { $0 is UILabel }

En remarque, cela produira toujours un Array<UIView>, pas Array<UILabel>. À partir de la série bêta de Swift 2, vous pouvez utiliser flatMap pour cela:

var onlyUILabels = myArray.flatMap { $0 as? UILabel }

Auparavant (Swift 1), vous pouviez lancer un casting qui fonctionne mais se sent un peu moche.

var onlyUILabels = myArray.filter { $0 is UILabel } as! Array<UILabel>

Sinon, vous avez besoin d’un moyen de créer une liste des étiquettes. Je ne vois rien de standard, cependant. Peut-être quelque chose comme:

extension Array {
    func mapOptional<U>(f: (T -> U?)) -> Array<U> {
        var result = Array<U>()
        for original in self {
            let transformed: U? = f(original)
            if let transformed = transformed {
                result.append(transformed)
            }
        }
        return result
    }
}
var onlyUILabels = myArray.mapOptional { $0 as? UILabel }
50
Jesse Rusak

Dans Swift, vous devez utiliser le mot clé is si vous vous interrogez sur la classe correspondante. Dans la filter- fermeture, vous pouvez utiliser $0 pour spécifier le premier paramètre.

Échantillon

var (a,b,c,d) = ("String", 42, 10.0, "secondString")
let myArray: Array<Any> = [a,b,c,d]
var onlyStrings = myArray.filter({ return $0 is String })
onlyStrings // ["String", "secondString"]
7
wottpal

Sans entrer dans object.class () nirvana, dans Swift, nous pouvons toujours utiliser Objective-C Runtime pour obtenir des informations utiles sur la classe de l’objet comme suit (et ne pas relier exactement Objective-C): 

let objectClass: AnyClass = object_getClass(object) as AnyClass
let objectClassName =  NSStringFromClass(objectClass)
println("Class = \(objectClassName)")

Notez que nous obtenons le "MyProject". ou (parfois) le "Swift". préfixe, selon que vous vous référez à vos propres classes ou à des classes Swift:

UILabel // UILabel    
Swift._NSSwiftArrayImpl //Swift Array
MyProject.Customer_Customer_   //for a CoreData class named Customer
3
eharo2

Vous pouvez comparer les classes en utilisant les éléments suivants dans Swift:

 return object.dynamicType == otherObject.dynamicType

dynamicType retournera une instance de Class que vous pourrez comparer

0
TheCodingArt