質問

さて、私はあなたがguys'll私はこれについてとても困惑している理由をすぐに指摘することができるような感じがありますが、私は、コンパイラエラーまたは警告にはなりません、次の理由に関する質問があります:

NSString * intValue = [ NSString stringWithFormat:@"int = %i", [ [ self.selectedObject valueForKey:name ] integerValue ] ];

selectedObjectNSObjectであり、そしてnameは型@propertyintの名前であることを起こる。

どのような私を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"];

しかし、通常、あなたがコンパイル時の静的型チェックの利便性を得るため、NSStringsとして「しっかり」の文字列を入力して、唯一の静的なものが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'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top