開発メモ

開発関係のメモをいろいろと。たぶん。

Swiftの問題点

とりあえず、『The Swift Programming Language』を一通り読んだので、その中で気になったことのまとめ。

External Parameter Namesって必要?

関数やメソッドの引数に対して、外で使われる名前と中で使われる名前を別々に付けることが出来る機能なんだけど・・・ そもそも、これって必要?

Objective-Cの入門書だと、引数のラベルに対して『意味がわかるようになるからわかりやすい』って説明がついてたりするけど、現実的には意味が無いよね?

例えば、UIColorのcolorWithRedの場合。

UIColor* color = [UIColor colorWithRed:0.0 green:0.5 blue:1.0 alpha:1.0];

入門書だとこれで、それぞれの引数の意味がわかるようになるって論調なんだけど、実際には、定数をそのまま使うことなんてほとんど無いわけで。現実にはこんな感じになっちゃう。

UIColor* color = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];

Objective-Cでプログラムを書いてると、こういう場面に山ほど出くわすことになるんだけど、Swiftでも同じことを繰り返す必要があるんだろうか? 無駄じゃない?

External Parameter Namesの仕様がバラバラすぎる

ただでさえ存在価値に疑問を感じるExternal Parameter Namesだけど、関数とメソッドとイニシャライザーで、仕様がバラバラなのがさらに問題。

それぞれ、デフォルトの仕様はこんな感じ。

関数

  • すべての引数名は関数の中だけで使われる

通常のメソッド

  • 1個目の引数名はメソッドの中でだけ使われる
  • 2個目以降の引数名はメソッドの中と外で使われる

イニシャライザー

  • すべての引数名はメソッドの中と外で使われる

・・・わかりにくすぎない?

特に、通常のメソッドの仕様がひどい。Objective-Cの仕様を見習ったとか何とか書いてあるけど・・・ 今からでも修正してくれないかなぁ。

あくまでデフォルトの処理がこうなってるってだけだから、自作のライブラリに関しては『_』でExternal Parameter Namesを捨てることができるけど・・・ わかりにくいなぁ。

通常のメソッドは関数と同じ扱いにしてくれるだけで、ずっとマシになるだろうに。個人的には、External Parameter Namesをばっさり削除してくれるのが一番嬉しいけど。

非同期処理への対応が言語にない?

GCDを使えばObjective-Cの時代と同じことは出来るけど・・・ せっかく言語を新しくするんなら、非同期処理への対応ぐらい言語側で取り込んで良いのでは?

実は、ライブラリ側ですごく便利な仕組みが用意してあって、こんなの気にしなくて良くなるのかもしれないけど・・・ それとも、自分でライブラリを作れってことかな?

例外処理はどうなった?

何処にも記述がない。完全に、さっぱり無くなった? これまでも、Objective-Cで開発をする上では基本的に必要なかったけど・・・ あれば便利なんだけど。

新しく例外処理を追加したら、Objective-Cの時代の物とうまく混ざらないから止めたのかな。

アクセス制御に関する機能が無い?

publicやprivateの概念はなし? Objective-Cで使われることは滅多に無かったけど、それは、無名カテゴリやファイルローカルの変数で誤魔化してただけの話で。Swiftでも、同じようなテクニックで逃げろってことなんだろうか? それなら、素直にアクセス制御を導入するほうが良いのでは?

そう言えば、WWDCの発表では『namespace』って書いてあったけど、これはモジュール単位でどうにかしろって事なんだろうか? それとも、型ネストで逃げる?

アクセス制御が出来るようになった。

配列のコピーの仕様が微妙

  • 配列をコピーしただけだと、実は参照が共有される
  • 配列のサイズを変更すると共有が解除される
    逆に言うと、値を変更しただけでは共有は解除されない。

これって、如何にも罠にハマりそうな仕様では? 普通に、値を変更した時点で共有解除で良かったのでは? Stringはそうなってるでしょう?

仕様変更で、ArrayもDictionaryやStringと同じ扱いになったらしい(要確認)。

Classの型プロパティで値を格納する事ができない

簡単に言うと、クラス変数が使えない。これって、仕様としてどうなの?

Objective-Cの時代は、ファイルローカルの変数で誤魔化してたけど・・・ Swiftでも同じことをやらないと駄目なの? 素直に、言語側でサポートするべきなのでは?

ドキュメント化の標準がない

良いチャンスだから、ドキュメント化について標準を決めてしまえばいいのに。

文法が変わってObjective-C系のツールはそのままじゃ使えないだろうし・・・ そこまでやるだけのリソースがAppleに無いのか、それとも、単純に忘れてるのか。

Computed Propertiesのインデントがおかしい

ものすごく細かい話だけど、Computed Properties周りの字下げ処理がおかしい。

いわゆるgetter/setterの話。willSet/didSetも同様。

struct Rect {
    var origin = Point()
    var size = Size()
    var center: Point {
    get {
        let centerX = origin.x + (size.width / 2)
        let centerY = origin.y + (size.height / 2)
        return Point(x: centerX, y: centerY)
    }
    set(newCenter) {
        origin.x = newCenter.x - (size.width / 2)
        origin.y = newCenter.y - (size.height / 2)
    }
    }
}

Swift本だとこんな感じになってるけど、getやsetはもう一段下げるべきでは?

まとめ

基本的には新しい機能をうまく取り込んでまとまってて、Objective-C時代の問題点も解消してある。全体的に筋は良さそう。Objective-Cからの乗り換えも、どんどん進むんじゃないかと予想。

それだけに、気になるところは今のうちに修正してほしいなぁ。Appleの中の人は気にならないから、今の仕様になってるのかもしれないけど。


作成(2014/06/16)
更新(2014/07/08)
更新(2014/08/08)