【问题标题】:Swift KeyPath on optional value可选值上的 Swift KeyPath
【发布时间】:2018-07-20 05:04:40
【问题描述】:

如果我有

class Info {
    var name: String?
}

class User {
    var info: Info?
}

class WrappedClass {
    var user: User = User()
}


let nameKeyPath = \WrappedClass.user.info?.name //Gets me KeyPath
let referencedNameKeyPath = \WrappedClass.user.info!.name //Gets me ReferenceWritableKeyPath

nameKeyPath 给我一个KeyPath,我以后不能用它来修改名称值,但是如果我强制打开它,我会得到一个ReferenceWritableKeyPath,这就是我想要的。

不幸的是,由于意外发现 nil,沿线使用带有 nil 值的 referencedNameKeyPath 预期会崩溃。

我的问题是有没有办法将 KeyPath 转换为 ReferenceWritableKeyPath 或以某种方式解开它?

【问题讨论】:

  • 考虑尽可能使用非可选类型。一个类中的一个可选的不写初始化程序的不在场证明是一个非常坏的习惯????
  • 不幸的是,在我的情况下这是不可能的

标签: ios swift swift4 swift5


【解决方案1】:

您还可以在键路径上使用可选链接。创建两个键路径,一个用于用户,另一个用于信息中的名称。

let infoKeyPath = \WrappedClass.user.info

let nameKeyPath = \Info.name

现在,使用带有 keypath 的可选链接,它会产生 String? 作为结果。

let name = wrappedInstance[keyPath: infoKeyPath]?[keyPath: nameKeyPath]

【讨论】:

  • 这就是我要找的。谢谢!
【解决方案2】:

尝试将键路径作为计算的可选变量。像这样:

class WrappedClass {
  var user: User = User()

  var nameKeyPath: ReferenceWritableKeyPath<WrappedClass, String?>? {
    guard let _ = user.info else { return nil }
    return \WrappedClass.user.info!.name
  }
}

您仍然会使用 force unwrap 表示法,但它不应该引起任何问题,因为您特别注意它。

这样您就可以安全方便地使用计算出的密钥路径:

let instance = WrappedClass()

if let nameKeyPath = instance.nameKeyPath {
  instance[keyPath: nameKeyPath] = "Nikola"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    相关资源
    最近更新 更多