8
votes

Obtenez le type / la classe d'une propriété de son nom à Swift

permet de dire que j'ai cette classe code>: xxx pré>

si j'ai le nom d'une de ses propriétés (par exemple "enfants" code " >) Comment puis-je obtenir son type? (Dans ce cas [noeud]? Code>) p>

J'imagine avoir une fonction globale comme ci-dessous résoudra mes besoins: p>

func typeOfPropertyWithName(name: String, ofClass: AnyClass) -> AnyClass? {
    //???
}

// Example usage:
var arrayOfNodesClass = typeOfPropertyWithName("children", Node.self)


0 commentaires

5 Réponses :


3
votes

La réflexion est obtenue dans SWIFT en utilisant la fonction globale code>. Lorsque vous passez une instance de type à reflect () code> il renvoie un mirrorype , qui dispose d'une gamme de propriétés vous permettant d'analyser votre instance:

var value: Any { get }  
var valueType: Any.Type { get }
var objectIdentifier: ObjectIdentifier? { get }  
var count: Int { get }  
var summary: String { get }  
var quickLookObject: QuickLookObject? { get }  
var disposition: MirrorDisposition { get }    
subscript(i: Int) -> (String, MirrorType) { get }


4 commentaires

Je n'ai pas entendu parler de reflect () ou mirlortype avant. Merci de m'avoir appris quelque chose (voté.) Sont-ils documentés partout ailleurs que le site SwiftDoc.org? Je ne le vois pas dans l'un des ibooks Swift ou la référence de la bibliothèque standard. Le site SwiftDoc est une référence alphabétique et n'est pas géniale pour l'apprentissage. (Vous devez savoir ce que vous recherchez pour l'utiliser.)


La réflexion sur Swift ne semble pas être documentée officiellement par Apple. Comme indiqué sur le site Web SWIFTDOC.org, il s'agit de «documentation générée automatiquement pour SWIFT». C'est pourquoi il n'est ordonné que par ordre alphabétique. Je trouve cela très utile cependant, comme vous pouvez voir la majeure partie de ce que Swift lui-même a à offrir.


Comment avez-vous appris sur reflect () et mirlortype ? Explorer swiftdoc.org?


Plus ou moins. Je fais parfois parcourir Swiftdoc et je suis venu sur MirrorType il y a un moment. Je ne l'ai pas compris jusqu'à ce que je lisais des articles sur la réflexion à Swift. Initialement, je voulais simplement obtenir le nom d'une variable comme une chaîne et finalement trébucher sur cette question Stackoverflow-Question: Stackoverflow.com/Questtions/24006165/...



1
votes

Ceci semble fonctionner:

func getTypeOfVariableWithName(name: String, inInstance instance: Any) -> String? {
    let mirror = reflect(instance)
    var variableCollection = [String: MirrorType]()

    for item in 0..<mirror.count {
        variableCollection[mirror[item].0] = mirror[item].1
    }

    if let type = variableCollection[name] {
       let longName = _stdlib_getDemangledTypeName(type.value)
       let shortName = split(longName, { $0 == "."}).last
       
       return shortName ?? longName
    }

    return nil
}


0 commentaires

8
votes

SWIFT 2 strong> (Remarque: Réflexion modifiée): XXX PRE>

Classe personnalisée: P>

if person.propertyIsOfType("email", type: PropertyTypes.OptionalString)
{
    //true -> do something
}
else
{
    //false -> do something
}


0 commentaires

1
votes

Bâtiment sur @PeterKreinz Répondre Je devais pouvoir vérifier les types d'immeubles hérités également, donc ajouté un peu à son code ci-dessus: xxx

espère que cela puisse aider quelqu'un.

Swift 3 mise à jour: xxx


0 commentaires

0
votes

La solution fournie par @ Peter-Kreinz à l'aide de la classe Swift's Class Code> fonctionne magnifiquement lorsque vous avez une instance d'une classe et souhaitez connaître les types des propriétés. Toutefois, si vous souhaitez inspecter les propriétés d'une classe sans y avoir une instance, vous pourriez être intéressé par ma solution.

J'ai une solution qui trouve le nom et le type d'une propriété donnée toute classe qui hérite de NsObject code>. p>

J'ai écrit une longue explication sur Stackoverflow Voici , et mon projet est disponible Ici sur GitHub , P>

En bref, vous pouvez faire quelque chose comme ceci (mais vérifiez vraiment le code GITUB): P>

public class func getTypesOfProperties(inClass clazz: NSObject.Type) -> Dictionary<String, Any>? {
    var count = UInt32()
    guard let properties = class_copyPropertyList(clazz, &count) else { return nil }
    var types: Dictionary<String, Any> = [:]
    for i in 0..<Int(count) {
        guard let property: objc_property_t = properties[i], let name = getNameOf(property: property) else { continue }
        let type = getTypeOf(property: property)
        types[name] = type
    }
    free(properties)
    return types
}


0 commentaires