Swift 斯威夫特2中的反思

Swift 斯威夫特2中的反思,swift,reflection,swift2,Swift,Reflection,Swift2,我有一个类用户: import UIKit import ObjectMapper class User: NSObject, CustomStringConvertible, Mappable { var FirstName: NSString! ; var LastName: NSString! ; required init?(_ map: Map){ } func mapping(map: Map) { First

我有一个类用户:

import UIKit
import ObjectMapper


class User: NSObject, CustomStringConvertible, Mappable {

    var FirstName: NSString! ;
    var LastName: NSString! ;


    required init?(_ map: Map){

    }


    func mapping(map: Map) {

        FirstName <- map["FirstName"]
        LastName <- map["LastName"]

    }


    override var description:String {
        var s:String=""

  //USE REFLECTION TO GET NAME AND VALUE OF DATA MEMBERS      
        for var index=1; index<reflect(self).count; ++index {
            s += (reflect(self)[index].0 + ": "+reflect(self)[index].1.summary+"\t")
        }

        return s
    }
}
导入UIKit
导入对象映射器
类用户:NSObject、CustomStringConvertible、可映射{
var FirstName:NSString;
var LastName:NSString;
必需的初始化(umap:map){
}
func映射(映射:映射){

FirstName您可以访问反射属性“label”名称、值和类型,如下所示:

let mirror = Mirror(reflecting: SomeObject)

var dictionary = [String: Any]() 
for child in mirror.children {
    guard let key = child.label else { continue }
    let value: Any = child.value

    dictionary[key] = value

    switch value {
    case is Int: print("integer = \(anyValue)")
    case is String: print("string = \(anyValue)")
    default: print("other type = \(anyValue)")
    }

    switch value {
    case let i as Int: print("• integer = \(i)")
    case let s as String: print("• string = \(s)")
    default: print("• other type = \(anyValue)")
    }

    if let i = value as? Int {
        print("•• integer = \(i)")
    }
}

注意:根据后续问题,显示了确定反射值类型的三种方法。

我有一个解决方案,可以找到从
NSObject
继承的任何类的属性名称和类型

我写了一个很长的解释,我的项目是可用的

简而言之,您可以这样做(但请真正查看Github的代码):

公共类func getTypesOfProperties(包括类clazz:NSObject.Type)->字典{
变量计数=UInt32()
guard let properties=class_copyPropertyList(clazz,&count)else{return nil}
变量类型:Dictionary=[:]

对于0中的i.。这是您要查找的吗:?您的.childrend中的每个元素都将有一个.label和.value。如果您想要获取类型,那么您可以获取.value.dynamicType。有关详细信息,请参阅另一个提示:在进入循环之前应调用reflect一次。然后在循环中使用该变量。每次执行reflect(self)时将创建对象的快照。理论上,对象甚至可能在同一时间发生更改,从而产生不同的结果。
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
}