1

つまり、リテラルを使用しますが、iOS5をターゲットにします。

私はこれを知っていますが、その投稿は決定的なものではありません。

4

1 に答える 1

22

コンパイラを切り替えることはできますが、思ったとおりに機能しません(今試しました)。この新しい構文を使用するには、SDKをコンパイルするためのいくつかの要件があります(つまり、以前のiOSバージョンで機能しますが、iOS 6.0 SDKでコンパイルする必要があります)。現時点では、ここでそれらについて説明することは許可されていないと思いますが、「ModernObjective-C」WWDC2012ビデオで詳細に説明されています。

基本的に、構文はありますが、ライブラリはそれに応答する方法を知りません。

しかし、別の理論があります...私はそれを正しくしなかっただけです^^;

ただし、最終的には、 4.3を使用して5.xアプリにデプロイする必要はありませんしたがって、私の提案はアップグレードだけであり、実際にはマイナス面はありません(アプリをすぐにデプロイする場合を除きますが、その場合は、ほぼ完了していると思うので、すべてを変換するのは面倒です)。

編集(2か月後、iOS 6が公開されました)。カテゴリを使用して、新しいObjective-cリテラル構文のSDK要件を回避できます。NSArrayNSDictionaryにそれぞれ戻るカテゴリを追加- (id)objectAtIndexedSubscript:(NSUInteger)idxします(iOS 6ではとにかくそれが行われます)。また、およびそれぞれのカテゴリメソッドを追加します。これらのメソッドは、オブジェクトがまだ存在しない場合はオブジェクトを追加し、存在する場合はオブジェクトを置き換えます。- (id)objectForKeyedSubscript:(id)keyobjectAtIndex:objectForKey:NSMutableArrayNSMutableDictionary- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)index- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)index

1つの落とし穴:iOS 6の定義YESNO変更は、のブールリテラルに対応するために行われましたNSNumber。したがって、次のことを行う必要があります。

#if __has_feature(objc_bool)
#undef YES //Before it was (BOOL)1
#undef NO //Before it was (BOOL)0

#define YES __objc_yes
#define NO __objc_no
#endif

その理由は、新しい構文にはすでに構文の定義@( ... )(ボックス化された式)があり、古い定義は@(BOOL)1エラーとして解決されるためです。

于 2012-07-10T06:33:09.003 に答える