web-dev-qa-db-ja.com

IntでsetValue(value、forKey:key)を使用しますか?タイプは非キー値コーディング準拠のメソッドを起動します

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タイプで正常に使用されましたか?

25
Max MacLeod

純粋な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を参照してください。

24
CodaFi

あなたが捨てる気があるならSwiftタイプの変更:

var myId:Int?

に:

var myId:NSNumber?
3
TenaciousJay