从swift中的名称中获取属性的类型/类

nac*_*o4d 8 reflection swift

让我说我有这个class:

class Node {
    var value: String
    var children: [Node]?
}
Run Code Online (Sandbox Code Playgroud)

如果我有一个属性的名称(例如"children")我怎么能得到它的类型?(在这种情况下[Node]?)

我想像下面这样的全局函数可以解决我的需求:

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

// Example usage:
var arrayOfNodesClass = typeOfPropertyWithName("children", Node.self)
Run Code Online (Sandbox Code Playgroud)

Pet*_*inz 8

Swift 2(注:反射改变了):

import Foundation

enum PropertyTypes:String
{
    case OptionalInt = "Optional<Int>"
    case Int = "Int"
    case OptionalString = "Optional<String>"
    case String = "String"
    //...
}

extension NSObject{
    //returns the property type
    func getTypeOfProperty(name:String)->String?
    {
        let type: Mirror = Mirror(reflecting:self)

        for child in type.children {
            if child.label! == name
            {
                return String(child.value.dynamicType)
            }
        }
        return nil
    }

    //Property Type Comparison
    func propertyIsOfType(propertyName:String, type:PropertyTypes)->Bool
    {
        if getTypeOfProperty(propertyName) == type.rawValue
        {
            return true
        }

        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

自定义类:

class Person : NSObject {
    var id:Int?
    var name : String?
    var email : String?
    var password : String?
    var child:Person?
}
Run Code Online (Sandbox Code Playgroud)

获取"子"属性的类型:

let person = Person()
let type = person.getTypeOfProperty("child")
print(type!) //-> Optional<Person>
Run Code Online (Sandbox Code Playgroud)

物业类型检查:

print( person.propertyIsOfType("email", type: PropertyTypes.OptionalInt) ) //--> false
print( person.propertyIsOfType("email", type: PropertyTypes.OptionalString) //--> true
Run Code Online (Sandbox Code Playgroud)

要么

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


Mar*_*sel 3

Swift 中的反射是通过全局reflect()函数来实现的。当传递某种类型的实例时,reflect()它会返回一个MirrorType,它具有一系列属性,允许您分析您的实例:

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 }
Run Code Online (Sandbox Code Playgroud)