我试图在WWDC 2017基金会谈话中为KVO观察工作获得与示例非常相似的内容。我所看到的与那次演讲不同的唯一区别是,我必须调用super.init(),并且必须隐式地解开“kvo”令牌。Swift 4(BETA 2)基于WWDC对话的KVO崩溃
在操场使用下列内容:
struct Node {
let title: String
let leaf: Bool
var children: [String: Node] = [:]
}
let t = Node(title:"hello", leaf:false, children:[:])
let k1 = \Node.leaf
let k2 = \Node.children
t[keyPath: k1] // returns "false" works
t[keyPath: k2] // returns "[:]" works
@objcMembers class MyController : NSObject {
dynamic var tr: Node
var kvo : NSKeyValueObservation!
init(t: Node) {
tr = t
super.init()
kvo = observe(\.tr) { object, change in
print("\(object) \(change)")
}
}
}
let x = MyController(t: t)
x.tr = Node(title:"f", leaf:false, children:[:])
x
此错误:
fatal error: Could not extract a String from KeyPath Swift.ReferenceWritableKeyPath<__lldb_expr_3.MyController, __lldb_expr_3.Node>: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-900.0.45.6/src/swift/stdlib/public/SDK/Foundation/NSObject.swift, line 85
而且,看到此错误:
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0). The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation.
是任何人都能够得到这样的这工作,或者这是我需要报告的错误?
谢谢。我知道didSet,但我正在尝试新的KVO的东西。 – possen
所有伟大的,除了编译器不抱怨,我们有一个运行时崩溃(可能在运输后) – Jonny