如何使用 Swift 2.0 和反射获取属性名称及其值?

2024-01-21

给定这个模型:

public class RSS2Feed {

    public var channel: RSS2FeedChannel?

    public init() {}
}

public class RSS2FeedChannel {   

    public var title: String?
    public var description: String?

    public init() {}

}

我需要做什么才能获取属性名称和值RSS2FeedChannel实例?

这就是我正在尝试的:

let feed = RSS2Feed()
feed.channel = RSS2FeedChannel()
feed.channel?.title = "The Channel Title"

let mirror = Mirror(reflecting: feed.channel)
mirror.children.first // ({Some "Some"}, {{Some "The Channel Title...

for (index, value) in mirror.children.enumerate() {
    index // 0
    value.label // "Some"
    value.value // RSS2FeedChannel
}

最终,我试图创建一个Dictionary使用反射与实例匹配,但到目前为止我无法获取实例的属性名称和值。

文档说:

适当时可以使用可选标签,例如表示存储属性或活动枚举案例的名称,并将在字符串传递给后代方法时用于查找。

但我只得到一个“Some”字符串。

此外, value 属性返回一个带有 Type 的字符串RSS2FeedChannel当我期望每个孩子都是“反射实例结构的元素。”!


当我理解正确时,这应该可以解决您的问题:

func aMethod() -> Void {
    let feed = RSS2Feed()
    feed.channel = RSS2FeedChannel()
    feed.channel?.title = "The Channel Title"
//  feed.channel?.description = "the description of your channel"

    guard  let channel = feed.channel else {
        return
    }

    let mirror = Mirror(reflecting: channel)
    for child in mirror.children {
        guard let key = child.label else {
            continue
        }
        let value = child.value

        guard let result = self.unwrap(value) else {
            continue
        }

        print("\(key): \(result)")
    }
}

private func unwrap(subject: Any) -> Any? {
    var value: Any?
    let mirrored = Mirror(reflecting:subject)
    if mirrored.displayStyle != .Optional {
        value = subject
    } else if let firstChild = mirrored.children.first {
        value = firstChild.value
    }
    return value
}

只是 swift 3 的一些小变化:

private func unwrap(_ subject: Any) -> Any? {
    var value: Any?
    let mirrored = Mirror(reflecting:subject)
    if mirrored.displayStyle != .optional {
        value = subject
    } else if let firstChild = mirrored.children.first {
        value = firstChild.value
    }
    return value
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Swift 2.0 和反射获取属性名称及其值? 的相关文章

  • UIWebView 的“loadData”方法在 Swift 2 中不接受 nil 作为 baseURL

    我不想将任何值传递给 baseURL 参数loadData的方法UIWebView 在斯威夫特 1 2 中 nil工作正常 self loadFundInfo loadData responseData MIMEType contentTy
  • 在 Scala 中调用反射案例类构造函数

    我可以通过静态反射获取案例类的默认构造函数 val symbol currentMirror classSymbol myObj getClass typeSignature typeSymbol asClass val ctor symb
  • 在动态事件处理程序中引用“this”

    在我的 myClass 类中 我使用 Reflection Emit 为 myClass 类成员之一动态编写事件处理程序 我已经成功地做到了这一点 现在 我想修改事件处理程序以调用 myClass 类中的实例方法之一 但是 我无法弄清楚如何
  • Java:获取当前正在执行的Method对应的对象

    将当前正在执行的方法作为 Method 对象获取的最优雅的方法是什么 我的第一个明显的方法是在辅助类中使用静态方法 该方法将加载当前线程堆栈 获取正确的堆栈跟踪元素 并根据其信息构造 Method 元素 有没有更优雅的方法来实现这一目标 这
  • Java获取编译时安全方法名

    在使用反射类和注释时 我发现没有明确的方法以编译时安全的方式引用方法名称 我真正想要的是能够在注释中引用方法 可能看起来像 CallAfter method Foo class foo void Bar 目前 您只能使用字符串来执行此操作
  • 当参数为泛型时,Type.GetMethod 的类型数组中应包含哪些类型?

    如果我想通过反射调用泛型方法 我可以轻松使用this https stackoverflow com questions 232535 how to use reflection to call generic method技术 除非 该方
  • 使用prepareForSegue传递数据

    我试图将数据从viewController 1传递到viewController2 我有2个按钮和1个segue 因此有一个segue标识符 这2个按钮 按下时每个按钮应显示 1个标签用于显示标题 1个textView用于显示定义 我很难显
  • 为什么反射搜索会突然找不到任何东西?

    我根据这个问题的答案有以下代码如何获取 ASP NET C 中请求的文件的 MIME 类型 https stackoverflow com questions 1302264 how do i get the mime type of a
  • 为什么在授予用户权限时,UIUserNotificationType.None 在当前设置中返回 true?

    我正在编写一种方法来检查当前用户设置是否包含某些通知类型 当检查当前设置是否包含 UIUserNotificationsType None 时 无论授予权限还是拒绝权限 它都会返回 true 有谁知道这是为什么吗 func register
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • C语言中如何通过内存地址映射函数名和行号?

    如何用 GCC 中的内存地址映射回函数名称和行号 即假设一个 C 语言原型 void func Get the address of caller maybe this could be avoided MemoryAddress get
  • SpriteKitPhysicsBody非矩形碰撞

    pipeUp physicsBody SKPhysicsBody rectangleOfSize pipeUp size 在此编码中我使用了rectangleOfSize对于碰撞物理体 但如果我想按像素仅使用图像的形状 我应该使用什么而不是
  • 如何将字符串转换为任意类型

    我想将字符串转换为泛型类型 我有这个 string inputValue myTxtBox Text PropertyInfo propInfo typeof MyClass GetProperty myPropertyName Type
  • 如何在 iOS Swift 中获取来电的电话号码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在我的应用程序中获取来电者的电话号码 请有人迅速为我提供这个问题的解决方案 您将永远无法获得来电的电话号码 因为这是用户的私人数据
  • 检查文本字段是否为空会导致 Swift 2 错误

    我正在尝试检查文本框是否没有值 当我这样做时 if userEmail isEmpty userPassword isEmpty userPasswordRepeat isEmpty I get the following error I
  • 用于轻松动态反射的 C# 库

    是否有任何库 例如开源项目等 可以更轻松地使用复杂的反射 例如动态创建对象或类 检查实例等 Thanks 有一个LinFu http www codeproject com KB cs LinFuPart1 aspx可用的库除了反射之外还可
  • 从参数创建变量名

    是否可以创建名称中带有参数的变量列表 像这样的东西 for n 0 n lt val n int var n 0 通常情况下 不会 变量名称必须在编译时固定 它们不能依赖于运行时输入 所以如果n在您的示例中是输入 例如 来自用户 您想要的内
  • WinRT 不支持 Assembly.GetCallingAssembly,但适用于可移植类库?

    我需要获取有关调用我的组件的程序集的一些元数据 因此 使用Assembly GetCallingAssembly 似乎是天作之合 但是 我发现它在除 Windows 应用商店之外的任何地方都适用 支持的地方 手机7 0 http msdn
  • 如何根据表名在 DbContext 中选择正确的 DbSet

    假设我有一个包含以下 DbSet 的 DbContext class Amimals DbContext public DbSet
  • 如何反映动态对象的成员?

    我需要从 NET 4 中使用动态关键字声明的对象中获取属性及其值的字典 看来使用反射来实现这一点是行不通的 Example dynamic s new ExpandoObject s Path Home s Name Home How do

随机推荐