KeyPath 对可选值的奇怪错误

Mar*_*chi 5 swift keypaths xcode11

考虑以下代码片段

class A {

    var value: Int?

}

let a: A? = A()
let kp = \A.value
a?[keyPath: kp] = 10
print(a?.value)
Run Code Online (Sandbox Code Playgroud)

这完美地工作Optional(10)并按预期打印。在我的实际应用程序中,我试图以这种方式设置的字段被声明为Date?,它会导致一些奇怪的错误。我的实际应用程序的 MWE 是这样的:

class A {

    var value: Date?

}

let a: A! = A()
let kp = \A.value
a?[keyPath: kp] = Date() // Line with error
print(a?.value)
Run Code Online (Sandbox Code Playgroud)

然而,编译器抱怨突出显示的行并说:

可选类型“日期?”的值 必须解包为“日期”类型的值

修复:使用“??”合并 当可选值包含“nil”时提供默认值

修复:使用 '!' 强制解包 如果可选值包含“nil”则中止执行

这是编译器的错误,我们可以期望在最终版本之前修复,还是我对关键路径不了解?

我正在使用 Xcode 11 beta 3,但我在 beta 2 中也遇到了同样的问题。如果它有用,实际代码在这里

Joa*_*son 3

写这个没有!和 ?作品

let a = A()
let kp = \A.value
a[keyPath: kp] = Date() 
print(a.value)
Run Code Online (Sandbox Code Playgroud)

或仅作为可选

let a: A? = A()
let kp = \A.value
a?[keyPath: kp] = Date() 
print(a?.value)
Run Code Online (Sandbox Code Playgroud)

  • @Joakim 它不适用于强制可选的原因是什么? (2认同)