私は、WWDC 2017 FoundationのKVO観測のための話の例に非常によく似た何かを得ようとしています。私は、その話とは異なる唯一の違いは、super.init()を呼び出さなければならず、暗黙のうちに "kvo"トークンをアンラップさせなければならないということでした。WWDCトークに基づいたSwift 4(BETA 2)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
このエラー:ようなものを得ることができ、誰が
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.
です:また
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
は、このエラーが表示この作業、またはこれは報告する必要があるバグですか?ここ
ありがとうございました。私はdidSetについて知っていたが、私は新しいKVOのものを試していた。 – possen
コンパイラ以外のすべての偉大な、と文句を言っていない、我々は(おそらく出荷後に)ランタイムクラッシュを持っている – Jonny