assaulter's diary

主にバイクについて

Swiftつらいことまとめ

XCode Beta1出た時に勉強のためにMasterDetailなテンプレートからプロジェクトを作成して色々試しているんですが、辛いことが多いのでメモしておきます。

XCodeの補完が辛い

対処法:コメントから日本語を削除。デフォルトで作成されるコメントに年が入ってるのでグレップして削除。辛い。

ブロック内でweak, unownedが使えない

謎。playgroundやと動くwww

なので、

@lazy var hoge = {//初期化のためのクロージャ }()

でいいのにクロージャ内でdelegate = selfする系だとわざわざ初期化関数を作る。辛い。

privateが無い

最初はどうでも良いか〜って思ってたけど、インスタンス変数が外部からセットされることを前提にしているのか、内部で使いまわすために定義されているのかが分からなくなってくる可能性大。

ここらへんはObCのヘッダと実装ファイルにプロパティ宣言を分けるやつ好きだったんですけどね〜。

関数の補完が謎

引数なしの関数を定義して、補完機能を使って書こうとすると

func hoge() -> String { return "hoge" }

みたいな関数を定義してると、hoge(self: クラスの型)でしょ?という謎補完をしてくる。そしてそのままコールすると引数たりんよエラーが出る。どこ見に行ってるんだろう・・・

self.で呼んであげると動くけど、補完が効かないので、一旦hogeで補完して頭にselfを付けるという作業をしています。辛い。 

nilを返すのにimplicityUnwrapするapiがある

Swift - ImplicityUnwrapOptional型な戻り値の関数の扱い方 - Qiita

Qiitaの方には回避方法を書いたんですが、Objective-Cnilも返すapiをそのまま移植したのか知りませんが、戻り値の型定義がImplicityUnwrapOptionalだったりするので、ランタイムエラーになるやつがある。nil返す可能性あるんだったら素直にOption型でいいんじゃないかなぁ。辛い。

(追記)for-inが辛い

Objective-C時代のコレクションは何でもかんでも突っ込めたのですが、Swift先生は型に厳しいのでこういうことをします。

var set = NSMutableSet()
set.addObject("h")
set.addObject("o")
set.addObject("g")
set.addObject("e")

for str: AnyObject in set {
    if let _str = str as? String {
        println(_str)
    }
}

で、コレをCLLocationManagerのmonitoredRegion(戻り値: NSSet!)に対してやろうとしたらXCodeが100%クラッシュしやがるので、完全にやる気なくなりました。

まとめると

今すぐやらなくても良い言語な気がしてきました...(こういうのを書いてあわよくば解答を得ようとするスタイル...つらいなぁ〜