让我说我有这个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)
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)
Swift 中的反射是通过全局reflect()函数来实现的。当传递某种类型的实例时,reflect()它会返回一个MirrorType,它具有一系列属性,允许您分析您的实例:
Run Code Online (Sandbox Code Playgroud)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 }