ボクがSwiftをやめた理由(ワケ)

このエントリはポエムです。

ゼロからSwiftを書いたのではなく、Objetive-Cで書かれたプロジェクトをSwiftで書き換えていた話です
開発環境は C2DのMBP+Marvericks Xcode 6.1.1 ターゲットプラットフォームはOSXです

文字列リテラルの連結

まず、最初に困ったのが、文字列リテラルの連結。
C/Objective-Cでは文字列リテラルコンパイラに連結してもらうことが可能です。

NSString *string =
@"var emb = document.getElementById('flashWrap');"
@"var rect = emb.getBoundingClientRect();"
@"var atop = rect.top;"
@"var aleft = rect.left;";

こういう感じ。
分割して書くのは読みやすいから。

ところがSwiftでは文字列リテラルの連結がないため、こう書きました。

let string =
"var emb = document.getElementById('flashWrap');" +
"var rect = emb.getBoundingClientRect();" +
"var atop = rect.top;" +
"var aleft = rect.left;"

しかし、コンパイルが異常に遅くなり作業に支障が出るため文字列リテラル連結その後 - masakihの日記 のように書くことで対処したが、本質的に問題の解決とならない上、ステートメント実行時に毎回連結が行われるという無駄も発生するようになった。

NSArray、NSDictionaryが使えない

+initialize, +load などが実行されるのような早い段階で NSArray, NSDictionay を生成しようとすると落ちる。

// 一番外のスコープ - C言語ならグローバルスコープと呼ばれる位置
let array: NSArray = []


//あるいは
class AClass : NSObject {
    //
    var array:[AnyObject]? = nil
    override class func load() {
        array = ["hoge", "hoge"]
    }
}

これだけで落ちる。


なぜかdylibがロードされる前に使用しようとして落ちる。
デバッグビルドでしか試していないが落ちるものは落ちる。

コンパイルが遅い

これはホントにびっくりする
遅い理由には二つあって

  • 根本的に遅い
  • ひとつのファイルが更新されるたびにプロジェクト内の全てのswiftファイルがコンパイルされる


プロジェクトに空のswiftファイルを追加するだけで全swiftファイルを再コンパイルするのやめてください

その空のファイルに改行1個増やしただけで全swiftファイルを再コンパイルするのやめてください

プロジェクトが大きくなれば大きくなるほどビルド時間がドンドン長くなるのやめてください

File I/O が遅い気がする

気のせいかもしれない。ポエムなので検証とかどうでもいいです

NSManagedObjectのサブクラスの問題

- (void)setValue:forKey:
- (id)valueForKey:
- (void)setValue:undefinedKey:
- (id)valueForUndefinedKey:

この辺りをオーバーライドすると劇的に遅くなる。びっくりする。ポエムなので検証とかどうでもいいです

例外がない

キャッチも出来ないから発生したら死ぬしかない
ダイイングメッセージが残せないってこと
無視して続行もできないってこと
そう、Xcodeがたまに見せる「俺が食い止めているうちに早く逃げろ!」もできなくなるってこと

アプリのサイズが大きくなる

1MB程度のアプリが7MBになってたらびっくりします

SourceKitService

うん。





以上、田村由美信者のポエムでした