permet de dire que j'ai cette classe si j'ai le nom d'une de ses propriétés (par exemple J'imagine avoir une fonction globale comme ci-dessous résoudra mes besoins: p> code>:
"enfants" code " >) Comment puis-je obtenir son type? (Dans ce cas
[noeud]? Code>) p>
func typeOfPropertyWithName(name: String, ofClass: AnyClass) -> AnyClass? {
//???
}
// Example usage:
var arrayOfNodesClass = typeOfPropertyWithName("children", Node.self)
5 Réponses :
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 }
Je n'ai pas entendu parler de reflect () code> ou
mirlortype code> 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 () code> et
mirlortype code>? Explorer swiftdoc.org?
Plus ou moins. Je fais parfois parcourir Swiftdoc et je suis venu sur MirrorType Code> 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/...
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 }
Classe personnalisée: P> if person.propertyIsOfType("email", type: PropertyTypes.OptionalString)
{
//true -> do something
}
else
{
//false -> do something
}
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: espère que cela puisse aider quelqu'un. P > Swift 3 mise à jour: strong> p>
La solution fournie par @ Peter-Kreinz à l'aide de la classe J'ai une solution qui trouve le nom et le type d'une propriété donnée toute classe qui hérite de 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> 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.
NsObject code>. 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
}