NSKeyValueCoding準拠のSwift NSObjectサブクラスでsetValue(value, forKey: key)
メソッドを正常に使用しています。
これは、文字列オプションで完全に機能します。
_var name:String?
_
ただし、Intオプションでは失敗し、デバッグ目的でオーバーライドした未定義のキーメソッドがトリガーされます。
_override func setValue(value: AnyObject!, forUndefinedKey key: String!) {
println("\(self) this class is not key value coding-compliant for the key \(key)")
}
_
したがって、たとえば、適切な整数値を持つmyId
のキーは、上記の未定義のキーメソッドをトリガーします。
_var myId:Int?
_
上記の定義をオプション以外に変更すると、すべてが正常に機能します。
_var myId:Int = 0
_
オプションとしてmyId
を使用して、キャスト、アンラップ、初期化など、考えられるすべてのことを絶対に試しました。クラスをそれらの数値に準拠したキー値と見なさないだけです。
良い数値だと思います。 var宣言をStringに変更しますか?クラッシュします。 lldbでも問題なく表示されます。
_Printing description of key:
myId
key NSObject 0x00007fb8d530ca20 0x00007fb8d530ca20
k NSString "myId" 0x00007fa2aa942f20
value __NSCFNumber * Int64(4348129) 0xb000000004258e13
Printing description of value:
4348129
(lldb)
_
だから、問題は、誰かが-in Swift --NSKeyValueCodingメソッドsetValue(value, forKey: key)
Intタイプで正常に使用されましたか?
純粋なSwiftオプションはObjective-Cオブジェクトではないため、KVOは純粋なSwiftオプションでは機能できません。Swiftはdynamic
または@objc
は、有効なObjective-Cに相当するものがないため、一般的なクラスと構造を使用します。そのため、ランタイムは、これらの種類のオブジェクトのインスタンスでKVOをサポートするように設定されていません。 String?
を使用すると、その型はNSString
に無料でブリッジされるため、ランタイムが完全に理解しているObjective-C型であるNSString *
と意味的に同等です。 。しかし、それをInt?
と比較してください。その意味的には、Optional<Int>
やUnsafePointer<Int>
ではなくNSNumber *
になります。今のところ、タイプチェッカーに次のことを納得させる必要があります。 NSNumber!
を使用してObjective-Cで表すのは安全です。
これは完全に逆であり、私の意見では、型システムの残念な制限です。この投稿に出くわしたエンジニアについては、rdar:// 18624182を参照してください。
あなたが捨てる気があるならSwiftタイプの変更:
var myId:Int?
に:
var myId:NSNumber?