Java使いがSwiftを学ぶ – #2 制御構文&関数など
SwiftとJavaの比較つづき
今回もSwift構文のまとめです。
制御構文・関数などなどを解説していきます。
動作環境
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.10.5
- Xcode : 7.0.1
- Java : 1.8
いろいろな制御構文
制御構文(if)
まずはJavaのif文。
Java
int num = 1; if (num == 1) { ・・・ } else if (num == 2) { ・・・ } else { ・・・ }
Swiftの場合、if文はカッコなしで記述可能です。(つけてもOK)
なお、if文内の処理が1文だけだったとしても、ブレースは省略不可能。
Swift
var num = 1 if num == 1 { ・・・ } else if num ==2 { ・・・ } else { ・・・ }
制御構文(switch)
次はswitch文です。まずはJavaの場合。
Java
String s = "hello"; switch (s) { case "hello": System.out.println("hello"); break; case "world": System.out.println("world"); break; default: System.out.println("other"); }
Swiftでは、break文をいちいち書く必要はありません。
Swift
var s = "hello" switch s { case "hello": print("hello") case "world": print("hello") default: print("other") }
ちなみに、こんな感じでrange演算子を使って範囲を指定することもできます。
Swift
switch i { case 1...10: //1から10まで print("1〜10") case 100 <.. 1000: //100から1000未満 print("100〜1000") default: print("other") }
制御構文(for)
次はswitch文です。まずはJavaの場合。 普通のforループか、for-eachを使用します。
Java
int[] numbers = {1,2,3,4,5}; //基本的なforループ for(int i = 0;i < numbers.length; i++) { System.out.println(numbers[i]); } //for-each for(int num : numbers) { System.out.println(num); }
Swift版です。
Swift
var numbers = [1,2,3,4,5] //基本的なforループ(あまり使わない?) for var i = 0; i < numbers.count; i++ { print(numbers[i]) } //for-each for num in numbers { print(num) }
また、取り出した値が必要ない場合、下記のようにします。
Swift
// 取り出す値は使わない場合 for _ in 1...10 { print("hello!") }
制御構文(while,do-while)
続けて、whileとdo-whileも見てみましょう。
まずはJavaの場合。
Java
int[] numbers = {1,2,3,4,5 }; //while int i = 0; while( i < numbers.length) { System.out.println(numbers[i]); i++;; } //do-while int j = 0; do { System.out.println(numbers[j]); j++;; } while( j < numbers.length);
対象がコレクションであれば、最近はstreamつかったりするかもしれません。
Swift版です。do-while文は2.0からrepeat-whileになってます。
Swift
var i = 0 while i < numbers.count { print(numbers[i]) i++ } var j = 0 repeat { print(numbers[j]) j++ } while j < numbers.count
関数
定義方法
関数の定義方法についても比較しましょう。
まずはJavaの関数定義方法です。
Java
/* [アクセス修飾子]<戻り値><関数名>(<引数>) { //処理内容 } */ public int add(int x, int y) { return x + y; } //呼び出す add(10.20);
Swiftの場合です。
Swift
<br />/* [アクセス修飾子]func <関数名>(<引数>) -> <戻り値> { //処理内容 } */ func add(x:Int,y:Int) -> Int { return x + y } //呼び出す add(10,y:20)
SWiftの関数呼び出しの場合、2つ目以降の引数にはラベル名が必須です。
なお、下記のように引数に外部名をつけることもできます。
Swift
func add(arg1 x:Int, arg2 y:Int) -> Int { return x + y } //外部名を指定して呼び出す add(arg1: 10, arg2: 20)
デフォルト引数
Javaにはありませんが、Swiftには関数のデフォルト引数があります。
Swift
func add(x:Int = 1, y:Int = 2) -> Int { return x + y } //呼び出す add(10) //12
この場合、引数名=外部名となり、引数が省略可能になります。
可変引数
可変長引数の記述方法です。まずはJava版。
Java
int add(int... args) { int result = 0; for(int arg : args) { result += arg; } return result; }
引数の型のあとに「...」をつけます。
Swiftの場合も同じく、型のあとに「...」をつけます。
Swift
func add(nums:Int...) -> Int { var result = 0 for num in nums { result += num } return result } add(1,2,3,4)
inout引数
これはJavaにはない機能です。
inout引数を使用すると、引数を参照渡しにすることができます。
例えば次のようなinc関数に場合、引数の値を書き換えても、呼び出し元の変数に変化はありません。
Swift
func inc(var num:Int) -> Void { num++ } var num:Int = 1 inc(num) print(num) //値は1のまま
しかし、関数定義時の引数にinoutをつけ、関数呼び出し時に&をつけて引数を渡せば、
呼び出し元引数の値を書き換えることができます。
Swift
func inc(inout num:Int) -> Void { num++ } var num:Int = 1 inc(&num) print(num) //値は2になる
タプル
未だにJavaには、タプルがありません。
Swiftにはタプルがあります。
下記のように、カッコでくくり、各フィールドを:区切りにしてタプルを定義できます。
Swift
var t = (name:"taro",age:35) print(t.name) print(t.age)
また、タプルを戻り値とするには下記のようにします。
Swift
func myFunc() -> (z1:Int,z2:String) { ・・・ }
さらに、単純にカンマ区切りでもタプルを作成できます。
この場合、t.0のように、数値をプロパティとしてアクセスします。
Swift
var t = (10, "abc", 3.14) t.0 // 10
まとめ
今回は制御構造から関数の基礎、タプルなどについて解説しました。
次はクラスの予定です。