【问题标题】:How do i get labels from mirror with empty values如何从具有空值的镜像中获取标签
【发布时间】:2019-12-07 11:11:11
【问题描述】:

我想要做的是当我启动应用程序时,保存所有模型中常量的所有名称(在 userDefault 中)。我打算用一个看起来像这样的函数来做:

    public static func setup(models: [Codable]) {
            models.forEach { (model) in
                let mirr = Mirror.init(reflecting: model)
                mirr.children.map({
                    UserDefaults.save("\(type(of: model))+\($0.label!)")})
            }
    }

请注意,我还没有完成。

据我所知,使用此方法有 3 种解决方案。除非变量/常量具有实际值,否则镜子不会显示标签。它变得非常丑陋,我想知道我是否可以做一些工作,因为现在你这样称呼它。

场景 A:

public struct Testing: Codable {
    let name: String = ""
    let sex: String = ""
}

setup(models: [Testing()])

场景 B:

public struct testing: Codable {
    let name: String
    let sex: String
}

setup(models: [Testing(name: "", sex: "")])

场景 C:

public struct testing: Codable {
    let name: String
    let sex: String

    init(name: String =  "", sex: String = "") {
        self.name = name
        self.sex = sex
    }
}

setup(models: [Testing()])

所以基本上我想做的是:

public struct testing: Codable {
    let name: String
    let sex: String
}

setup(models: [Testing()])
// or 
setup(models: [Testing.self])

或者任何不会强迫我初始化值的东西。 我想这是不可能的,但也许有人有一些黑客在那里工作...... 提前致谢。

【问题讨论】:

  • 如果不处理 JSON 类型,为什么还要使用 Codable?您可以根据需要简单地使用 init 创建一个结构。
  • 我将在稍后阶段使用可编码。正如我提到的,我不想创建那种 init,因为它很难看。并且有点使编码变得多余
  • 好吧,那有什么丑陋的?
  • 我不想创建一个仅用于此目的的 init 方法。想象一下有 10 个具有 10-15 个值的结构体......这是我们不会使用的很多行。

标签: swift struct initialization mirror


【解决方案1】:

您可以简单地将您的 setup(models:) 方法更新为,

public func setup(models: [Codable]) {
    let arr: [String] = models.compactMap {
        let mirror = Mirror(reflecting: $0)
        if let name = mirror.children.first(where: { $0.label == "name" }) {
            let value = "\(type(of: $0))+\(name.value)"
            return value
        }
        return nil
    }
    UserDefaults.standard.set(arr, forKey: "Names")
}

【讨论】:

  • 由于设置功能需要采用[Codable]而不是[Testing],它不会工作?
  • 为什么不起作用?您是否为所有包含name 作为属性的Codable 类型创建了通用setup 方法?
  • 是的,它是通用的,但不,它们都不包含名称。它是随机的。它可以是任何属性。
  • 如果没有,那么你将如何从他们那里得到名字?
  • 创建一个镜像let mirror = Mirror(modelı[0]) 循环遍历它的孩子mirror.children.foreach {$0.label} 我在问题中写了我是如何做到的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 2013-10-29
  • 2022-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多