如何使用 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 和反射获取属性名称及其值? 的相关文章

  • 从参数创建变量名

    是否可以创建名称中带有参数的变量列表 像这样的东西 for n 0 n lt val n int var n 0 通常情况下 不会 变量名称必须在编译时固定 它们不能依赖于运行时输入 所以如果n在您的示例中是输入 例如 来自用户 您想要的内
  • 调用方法参见java注解

    假设我有这样的情况 public String method String s return stringForThisVisibility s EnumVisibility PUBLIC 我想用这样的注释替换它 VisibilityLev
  • 使用 system.reflection 列出类字段

    我需要获取一个列表来存储类中的所有字段 值 这个班级只是一些公共的const string我在下面粘贴的变量 public class HTDB Cols public class TblCustomers public const str
  • 搜索TableView无法选择行

    在搜索 tableView 时 每次我尝试选择一行时 它都会返回到未搜索的 tableView 我缺少什么 当不过滤表格时 segue 工作得很好 当搜索栏被激活时 选择行的能力就会消失 import UIKit import Founda
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • ModelBinder 验证在使用反射的 getter 上中断

    我遇到了一个似乎与反射和模型绑定验证有关的问题 并且FormatterParameterBinding ExecuteBindingAsync 特别是 虽然我可以使用方法来做我想做的事情 但如果我可以使用属性 我会更喜欢它 在这里 我正在寻
  • 搜索结果中的 Swift 搜索结果控制器连接到另一个视图控制器

    Problem 我有一个表格视图 用户可以滚动查找某些内容或使用搜索栏 搜索栏不是使用 StoryBoard 创建的 我的观点有一个UISearchController处理搜索栏和搜索结果更新 我遇到的问题是 自从我SearchResult
  • 如何通过反射访问Generic.List的索引?

    好的 我有一个类 我将一个对象作为属性传递 我传递的对象是List
  • 尺寸图像引脚注释

    我用个人形象代替了传统的红色别针 当我打开地图显示图钉时 图像覆盖了整个地图 引脚图像是否有最大尺寸 或者如何在代码中集成某些内容以适合尺寸标准经典引脚 func mapView mapView MKMapView viewForAnnot
  • 使用反射更改布尔字符串值不起作用

    我正在尝试 Java 反射和内联字符串 并得出了令我困惑的结果 import java lang reflect Field public class HappyDebugging public static void main Strin
  • Swift Mirror 反射不返回 UIVIew 上的属性

    尝试使用以下内容获取 UIView 或 UIViewController 的所有属性 func propertysNames gt String var s String for c in Mirror reflecting self ch
  • 如何动态计算 C# 表达式?

    我想做相当于 object result Eval 1 3 string now Eval System DateTime Now ToString as string 关注比里斯link http www codeproject com
  • GetReferencedAssemblies 不返回所有程序集

    我在表单中有以下代码 并试图找到一种方法来加载由名为的表单引用的项目程序集DataObjects 使用以下代码 我只列出了六个程序集 查看表单所在项目的引用 有十三个程序集引用 这里有什么问题吗 private void ListRefer
  • 如何通过反射判断泛型数组元素的类型?

    我想做的是没有泛型类型很简单 SomeType s new SomeType 5 for int i 0 i lt 5 i s i new SomeType 使用泛型 这就是我到目前为止所拥有的 private static T TypeM
  • 在 Swift 2.0 中将字符转换为 Int

    我只想转换一个特点进入一个Int 这应该很简单 但我发现以前的答案没有帮助 总有一些错误 也许是因为我正在 Swift 2 0 中尝试它 for i in unsolved characters fileLines String i toI
  • 如何使用反射来确定 F# 联合类型是否是类似枚举的联合(每种情况下都没有字段)

    术语 在下面的文章中 我将使用术语 引用枚举 来指代 F 类型 该类型是在每种情况下都没有字段的可区分联合 例如 type AReferenceEnum Yes No Maybe 要求 我需要一个给定的函数Type 返回一个bool告诉类型
  • 您可以从 MethodInfo 对象获取 Func (或类似的)吗?

    我意识到 一般来说 使用反射会对性能产生影响 实际上 我本人根本不喜欢反思 这纯粹是学术问题 假设存在一些如下所示的类 public class MyClass public string GetName return My Name 请耐
  • Swift:覆盖子类内的类型别名

    所以我正在考虑在我的项目中使用自定义模式 但我无法让它发挥作用 主要思想是改变typealias在每个子类上访问子类特定的接口 protocol InstanceInterface class typealias Interface var
  • 将 python 'type' 对象转换为字符串

    我想知道如何使用 python 的反射功能将 python 类型 对象转换为字符串 例如 我想打印一个对象的类型 print My type is type some object which obviously doesn t work
  • C# 反射属性顺序

    我正在使用代码https stackoverflow com a 531388 528131 https stackoverflow com a 531388 528131要成功地从基类中检索对象实例的所有属性 问题在于首先要迭代派生类型的

随机推荐