首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可选值的Swift KeyPath

可选值的Swift KeyPath
EN

Stack Overflow用户
提问于 2018-02-09 12:15:18
回答 2查看 3.8K关注 0票数 4

如果我有

代码语言:javascript
复制
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,或者在此过程中以某种方式展开它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-09 16:15:50

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

代码语言:javascript
复制
let infoKeyPath = \WrappedClass.user.info

let nameKeyPath = \Info.name

现在,使用带有键盘的可选链接,它将生成字符串?作为结果。

代码语言:javascript
复制
let name = wrappedInstance[keyPath: infoKeyPath]?[keyPath: nameKeyPath]
票数 7
EN

Stack Overflow用户

发布于 2018-02-09 15:04:19

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

代码语言:javascript
复制
class WrappedClass {
  var user: User = User()

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

您仍然以力解表示法结束,但它不应引起任何问题,因为您特别保护它。

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

代码语言:javascript
复制
let instance = WrappedClass()

if let nameKeyPath = instance.nameKeyPath {
  instance[keyPath: nameKeyPath] = "Nikola"
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48705622

复制
相关文章

相似问题

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