NSStringリテラルのあれやこれ
NSStringリテラルってのは
NSString *string = @"hoge";
これのことです。
これについてのアレな機能とバグのご紹介。
アレな機能とは、C言語の文字列のように、文字列連結ができること。
つまりこう書けます。
NSString *string = @"hoge" @"huga";
これは、こう書くのと同じです。
NSString *string = @"hogehuga";
なにが便利なのか。
ついこの間JavaScriptCoreでJavaScript書きました。こんな感じ。
NSString *script =
@"var iframe = document.getElementById('game_frame');"
@"var validIframe = 0;"
@"if(iframe) {"
@" validIframe = 1;"
@" var rect = iframe.getBoundingClientRect();"
@" var atop = rect.top;"
@" var aleft = rect.left;"
@"}";
便利。(内容は気にしないでね)
ちょっとしたバグ。
NSStringリテラルの連結はNSStringリテラルを空白文字区切りで並べて書きます。
が、なぜかこれでもエラーが出ずに連結できます。
NSString *string = @"hoge" "huga";
hugaの方はNSStringリテラルではなくC言語の文字列です。
NSString *string = @"hoge" "huga" @"foo" "bar" "hoge";
でも連結できます。
最初の文字列がNSStringリテラルなら後ろの並びには関係なく連結可能です。
追記:
バグを紹介したのはコンパイラのバージョンアップでいきなりコンパイル不能になる時限爆弾を仕込んでしまわないための注意喚起です。
このバグで遊んでみよう!とかではありません。