物理の研究の備忘録

高エネルギー物理学とかいうマニアックな研究分野の博士課程にいるわたしの備忘録。主にPCの設定とかプログラミングとか雑多な感じで

c++使いのSwift備忘録

今日から趣味でSwiftの勉強を始めたので普段俺が使ってるc++との違いなどを備忘録的にまとめてみる。

Swiftとは2014年にAppleによって発表された割と新しいプログラミング言語のことだ。Mac関連やiOSアプリを開発しようと思ったらSwiftとお友達になるのが1番の近道だと思われる。Swiftが出てくる前まではObjective-Cという言語がiOSの開発で使われていた。

実は何年か前に一度Objective-Cを勉強しようと思ったことがあったんだけど、いろいろと癖が強すぎて早々に挫折。最近になってSwiftについて少し調べてみたらObjective-Cに比べて随分とっつきやすい気がしたので再度挑戦してみる。

現在の開発環境はMac OS Sierra 10.12.5, X code8.3.2

ターミナルでswiftとコマンドを打ち込んでインタープリタとして使うこともできるけど、せっかくなのでX code開いて作業することにする。

 

四則演算とか

コメントアウト//または/* */なのでc++と同じ。四則演算も+-*/%等まったく同じ

に使えるので楽。この時点で妙に親近感を覚えるね。まぁこのへんはどの言語でも

似たようなものなのかもしれないけど。

 

実行結果の出力とか

print(“hoge”)

みたいな感じで出力できる。c言語でいうprintfc++でいうところのcout

Pythonprintだからpythonと同じって考えていいのかな?

ちなみに文字列は

print(“aaa+bbb”)

みたいな感じで足し算で簡単に繋げられるので便利。c++stringっぽい感じで使えるぞ。

てかSwiftって文末に;いらないのね。なんかpythonみたい。

型はおなじみのInt, Float, Double, Bool, Stringなどが普通に使える。

キャストも(Double)3みたいな感じだからc++とほぼ同じ。これはSwiftに限った話じゃないけど、Intと打った場合にどれくらいの容量が確保されるかはマシンスペックに依存する。なので、厳密に管理した場合はInt64みたいな感じで明示的にbit数指定することもできる。

 

変数や定数の宣言

c++だと

int a= 1;

と書いていた部分、Swiftだと

var a : Int =1

てな感じになる。:Intの部分で型を指定してるけど

var a = 1

みたいな感じで省略すると勝手に型推論してくれる。ただし型推論ばっかりしてるとコンパイルに時間かかっちゃうみたいなので、できるだけ明示的に型指定したほうがいいのかな?

定数の場合はvarの代わりにletを使う。なので

let b : Float = 10.0

c++でいう

const float b=10.0

と同じ。ちなみにc++だと10.0と書く代わりに10.と打ってもよかったけど、Swiftだとエラー出た。ちゃんと0まで書かないといけないのね。

 

配列

 c++だと、可変長の時はvectorを使って、普遍なときは普通の配列を使うって感じで雑多で統一感がない感じだったけど、Swiftの場合可変、不変はvarとletを使い分ければよくて、わりとすっきりしている。

・不変の場合

c++だと

const int array[3]={1,2,3};

Swiftだと

let array : [Int] =  [1,2,3]

・可変の場合

var array : [Int] = [Int]()

array.append(1)

array.append(2)

...

みたいな感じで要素追加する。

print(array[0])

とやるとちゃんと1が出力された。なんか[Int]()って書き方慣れないな。初期化的なことをしてるのかな?

 

関数

Int型の引数を2倍にして返す関数を考えてみる。c++だと 

int test(int a){

   int b = 2*a ;

   return b;

}

//in main function

cout<<test(5)<<endl;

出力結果:10

Swiftだと

func test(a : Int)->Int{

    var b = 2*a; //or var b:Int =2*a

    return b

}

//in main fuction

print(test(a:5))

出力結果:10

 

こんな感じ。慣れるまで時間かかりそうだな。2変数だと

func test(a : Int,b : Int)->Int{...}みたいな感じで適当に書いてみたら回った。

for文

1から10までの和をfor文で回すとする。足すたびに出力もする。

c++だと

int sum=0;

for(int i=0;i<10;i++){

  sum+=i+1;

  cout<<"sum="<<sum<<endl;

Swiftだと

var sum=0

for i in 0...9 {

    sum+=i+1

    print("sum=\(sum)")

}

出力結果

sum=1

sum=3

sum=6

sum=10

sum=15

sum=21

sum=28

sum=36

sum=45

sum=55

繰り返し回数が0...9で10回足されてることに注意。

\(sum)って書いてあるのはInt型の変数を文字列にぶち込みたい時にこう書けるらしい。

print("sum="+String(sum))

としても同じ。

cと同じ文法でfor文が回せる...?

少し調べてみると、このfor文の使い方はRubyに近いらしく、c言語ユーザーに馴染み深い記法

for(var i=0;i<10;i++)...

でも回ると書いてあった。俺的にはこっちの方が慣れ親しんでるので「やったー」と思いながら打ち込んでみたら

error: C-style for statement has been removed in Swift 3

なるエラーが出た。えぇ。。この書き方はSwift3で廃止になったみたいだ。ひどいよ...

まだ比較的新しい言語だから色々変わってる最中なのかな。ちなみに++,--もSwift3から廃止らしく、「i++じゃなくてi+=1のような書き方をしてね!」ということのようだ。

if文

cとほぼ同じ。cだと

if(a<10){

 ...

}

と書くとしたら、Swiftだと

if a<10{

 ...

}

と書けばいい。()がなくなっただけだね。elseも同様。これはすぐ覚えられそう。

 

X codeでプログラムを打ってみる

x codeにはPlaygroundってやつがあって、プログラムを打つとその場で出力結果を教えてくれるモードがある。今までのプログラムを打つとこんな感じ。

f:id:hakase73:20180419050257p:plain

今回は別にSwiftの文法に限った話で、特別iOS開発に関する事柄はでてこなかったので、次はiOS独自のクラスを使いながらiOS開発、オブエジェクト志向について学んでいこう。

おわり