Objective-Cの型推論
-
21-09-2019 - |
質問
さて、私はあなたがguys'll私はこれについてとても困惑している理由をすぐに指摘することができるような感じがありますが、私は、コンパイラエラーまたは警告にはなりません、次の理由に関する質問があります:
NSString * intValue = [ NSString stringWithFormat:@"int = %i", [ [ self.selectedObject valueForKey:name ] integerValue ] ];
selectedObject
はNSObject
であり、そしてname
は型@property
のint
の名前であることを起こる。
どのような私をperplexesすることは、コンパイラが[ self.selectedObject valueForKey:name ]
のリターン結果がNSNumber *
を呼び出してチェーンに順番にメッセージを(それを型キャストなし)タイプintegerValue
であると仮定して完全に喜んでいる理由です。
もちろん、KVCはNSNumber
に非オブジェクト「数」のタイプを包み込むが、コンパイラは、この特定のケースで-valueForKey:
を返すようNSNumber *
を知るための方法はありません。
なぜ、この結果は、の線に沿ってコンパイラの警告に「id
『-integerValue
』に応答しないこと」ではないでしょうか。
解決
私は右のそれを得た願っています:id
は「特別」であるためです。 id
型のオブジェクトは、あなたが望む任意のメッセージを送信することができ、何のチェックコンパイラによって行われ、すべてが実行時にチェックされますがありません。 (id
のような)他のすべてのタイプが「静的型付け」部分であるのに対し、または、言い換えれば、NSObject
タイプは、オブジェクティブCの「動的な型付け」部分である。
この方法で、そしてどこで動的型付けを使用します。このような何かをすることは完全に合法です。
id str1 = @"Hello";
id str2 = [str1 stringByAppendingString:@", world"];
しかし、通常、あなたがコンパイル時の静的型チェックの利便性を得るため、NSString
sとして「しっかり」の文字列を入力して、唯一の静的なものがvalueForKey
の状況のように、邪魔になり、動的型付けに頼ります。
他のヒント
時間が経過していると我々は今__auto_type
のおかげで、より良い型推論を持っています
Xcodeの8.以降で使用可能だから今、あなたが行うことができます。
#define let __auto_type const
#define var __auto_type
let a = @[@"pew pew"];
var b = 2;
b = a; //compiler warning "Incompatible pointer to integer conversion assigning to 'int' from 'NSArray *__strong const'"
とはるかの
実際には、私はこれはそんなにので、私は便宜上のポッドとしてこれを作っ言っています。
pod 'SwiftyObjC'