[Mac] Swiftを始めてみる

まずは、 iBooksからApple謹製のドキュメントをダウンロードするところから。
で、https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.playground.zipをダウンロードして、起動する。
すると、「Enable Developer Mode on this Mac?」と聞かれるので、もちろん「Enable」する。っていうか、そんなModeが存在するとか知らなかったし、むしろそうなってなかったのか!っていうオドロキ。このGuidedTour.playgroundとして配布されているSwift Tourという文書をひと通り読んで理解すると、Swiftの文法が理解できるようになる仕組みというワケだ。

Hello World

script言語でHello worldから始める意味ってのは、ほとんど無いよな。

println("Hello, world!")

行末に「;」が要らない。printlnってのは他の言語でもよくあるように、標準出力に出力後改行までしてくれるので、「\n」とか要らない。
ちなみに、このGuidedTour.playgroundってのは、なかなか面白い。sampleで記載されているcodeを編集可能で、編集するとその実行結果が脇に表示されるのな。Tutorialの仕組みとして面白い。こういうの他の言語でも流行らないかなぁ。
コレ

を、編集すると、

こうなる。

Xcode使わない場合

さっきの、

println("Hello, world")

だけを書いたhello.swiftというファイルをvimでもemacsでもAtomでもSublimeでもTextEditでも何を使ってもいいさ、とにかく作成して、swiftcというコマンドでcompileすると、実行ファイルであるhelloができる。

% cat >> hello.swift
println("Hello, world")
Ctrl-D
% swiftc hello.swift
% ls
hello*       hello.swift
% ./hello
Hello, world
%

こんな感じ。swiftcとは別にswiftというコマンドがあるけど、javacとjavaのように、swift ./helloとかしなくちゃいけないのかというと、そうでもなかった。

% swift ./hello
./hello:1:1: error: invalid UTF-8 found in source file
�X� H__PAGEZERO(__TEXT__text__TEXT����__⎽├┤b⎽__TEXT6�__stub_helper__TEXTP8P�__cstring__TEXT�
./hello:1:2: error: invalid UTF-8 found in source file
�X� H__PAGEZERO(__TEXT__text__TEXT����__⎽├┤b⎽__TEXT6�__stub_helper__TEXTP8P�__cstring__TEXT�
./hello:1:3: error: invalid UTF-8 found in source file
�X� H__PAGEZERO(__TEXT__text__TEXT����__⎽├┤b⎽__TEXT6�__stub_helper__TEXTP8P�__cstring__TEXT�
./hello:1:4: error: input files must be encoded as UTF-8 instead of UTF-16
�X� H__PAGEZERO(__TEXT__text__TEXT����__⎽├┤b⎽__TEXT6�__stub_helper__TEXTP8P�__cstring__TEXT�

swiftc --helpしても、swift --helpしても、どっちも「OVERVIEW: Swift compiler」って表示される(optionsは全然異なるので、当たり前だけれど別の用途で使われるコマンド)ので、javaとjavacのような関係ではないってことだ。
あ、実行してみたらわかった。swiftc ./hello.swiftすると、helloというobject fileができるだけなので、それを実行するためには改めて./helloする必要があるんだけれど、swift ./hello.swiftすると実行までしてくれるらしい。

変数と定数

varとletね。理解。letがconstね。perlとかだと、constに関しては変数名を全部大文字にしてみたりして主張するタイプだよ、オレ。変数の型を指定する必要はないけれど、明示的に指定する必要がある時は、変数名に「:」を付けてから型を指定する、と。これは、慣れるまで間違えそう。

let d: Double  = 10

あと、文字列中に変数を埋め込む時のやり方もちゃんと覚えておく必要がありそう。

let d: Double = 10
var s = "The value of d is \(d)."
println(s)

あれ?これを実行すると、 ""10.0""しか出力されない。"The value of d is 10.0."って出力して欲しいんだけれどな。謎だ。

let d: Double = 10
var s = "The value of d is " + String(d) + "."
println(s)

ならOKかと思いきや、

% swift ./test.swift
./test.swift:2:42: error: cannot invoke '+' with an argument list of type '($T6, UnicodeScalarLiteralConvertible)'
var s = "The value of d is " + String(d) + "."
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~

ってなるんだけど、なんぞこれ。
こういう些細な点に引っかかっては前に進めなくなるタイプだよな、オレ。

制御文

いわゆる、ループと条件分岐。普段、perlだったりRだったりVBAだったり、ちょっと昔はそこにJavaJavaScriptC#C++と、、、っていろいろ同時期に触ってたりすると、この辺りが一番混乱する。
for文の書き方とか、elseifの書き方とか、その言語の設計者が良かれと思ってそう設計してるんだろうけれど、バリエーション有り過ぎ。

for v in variables{
  println(v)
}

for文はこんな感じで良いみたいなんだけれど、vの前にvarとか付けなくても良いのな。むしろ、つけちゃダメなのな。変数宣言時には必ずvarが必要なのかと思ったけど、違うっぽい。
Cでいうこんな感じの100回繰り返す!みたいなのは、どう書けば良いのかよく分からない。whileで書けばよいのかな。

for( int i =0; i<100; i++){
 /* */
}

んで、elseifは、else ifって書けば良いらしい。だいたい、perlのelsifってのがオレの中で混乱のもとなだけなんだけれどな。

次は関数とか

とりあえず、そのうち、また勉強しなおす。
新しい言語を覚えるのはなかなか面白いんだけれど、使い道がないとツラい。perlみたいにCGIを書くために必死に覚えたとか、RとかExcelVBAみたいに仕事で解析に使うために少しずつ覚え始めてるみたいな「使う必然性」があると覚えるんだけれど、単に「なんかやってみよかな」程度だったりするとrubyとかpythonとかGoみたいに結局「perlでこういうふうに書く時に、[ruby|python|Go]ならどう書くんだっけ?」ってなった挙句「だったらperlで書けば速いか」ってなっちゃうんだけど、まあswiftもそうなりそうな予感ではある。