この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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
まとめ
今回は制御構造から関数の基礎、タプルなどについて解説しました。
次はクラスの予定です。