Java使いがSwiftを学ぶ – #2 制御構文&関数など

2015.10.08

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

まとめ

今回は制御構造から関数の基礎、タプルなどについて解説しました。
次はクラスの予定です。

参考サイトなど