首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速反射2

快速反射2
EN

Stack Overflow用户
提问于 2015-10-04 10:23:41
回答 2查看 3.7K关注 0票数 3

我有一个类用户:

代码语言:javascript
复制
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
    }
}

在Swive1.2中,我使用reflect()方法获取所有数据成员的数组及其名称和值。

现在,在我更新到swift 2之后,我将得到以下错误:

“反射”不可用:调用“镜像(反射:)”初始化器

通过一些试验,我能够通过以下方法获得数据成员的数量:Int(Mirror(reflecting: self).children.count),但仍然无法获得成员名及其值。

我研究了下列资源:

  1. https://netguru.co/blog/reflection-swift
  2. http://nshipster.com/mirrortype/

更新我在这里找到了一个答案:https://stackoverflow.com/a/32846514/4959077。但这并不能说明如何找出反映值的类型。如果值为int,并将其解析为字符串,则会产生错误。

EN

回答 2

Stack Overflow用户

发布于 2015-11-10 08:21:30

您可以访问反射属性"label“的名称、值和类型如下:

代码语言:javascript
复制
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)")
    }
}

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

票数 3
EN

Stack Overflow用户

发布于 2016-09-02 10:49:08

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

我在StackOverflow在这里上写了一个冗长的解释,我的项目是可用的这里是吉突布

简而言之,您可以这样做(但确实可以查看代码Github):

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32932447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档