Swift (iOS/OSX): 基本構文まとめ

更新しました。(2017.9.22) Swift 4 に対応しました。

Objective-C との差分

・文末のセミコロン不要
・NSObject の継承不要
・ヘッダーファイル不要
・ブラケットでなく、ドットシンタックス
・nil の代入ができない
・型の指定が省略可能
・mutable は変数か定数かで表現
・クラスの alloc 不要
・Cocoa とかの場合はインスタンスメソッドの With 以前をカット

コメント

// コメント
/*
複数行コメント
*/

変数

var name:String = "Swift"
var x:Double, y:Double
x = 20.0
y = 4.0
print(x)
print(name)

定数

let name2:String = "Swift"
print(name2)

演算

var a1 = x + y
var a2 = x - y
var a3 = x * y
var a4 = x / y
var a5 = x.truncatingRemainder(dividingBy: y) // x を y で割った余り
print(a1)
print(a2)
print(a3)
print(a4)
print(a5)

評価

var a = 10
var b = 20
print(a == b)  // a と b が同じ
print(a != b)  // a と b は違う
print(a > b)   // a は b より大きい
print(a < b)   // a は b より小さい
print(a >= b)  // a は b 以上
print(a <= b)  // a は b 以下

if 比較

if (評価1) {
  // 評価1がtrueの場合
} else if (評価2) {
  // 評価1がfalseで評価2がtrueの場合
} else {
  // 評価1、評価2どちらもfalseの場合
}

三項演算子

var result = a != b ? 1 : 2 // 評価がtrueの場合は1、そうでなければ2
print(result)

論理

var hoge = true
var hige = false
print(!hoge)      // a ではない否定
print(hoge && hige)  // a かつ b
print(hoge || hige)  // a または b

Switch 比較

var age = 20;
switch(age) {
case 20:
    // age が 20 のとき
    break;
case 21...25:
    // age が 21から25 のとき
    break;
case 18,19:
    // age が 18または19 のとき
    break;
default:
    // 上記以外のとき
    print("unko");
}

タプル

let position = (0,10)
print(position.0)
switch(position) {
case (0,0):
    break;
case (0,_):
    // _ はどの値でもOK
    break;
case (let x, 0):
    // x に position.0 の代入、どの値でも OK
    print(x)
    break;
case (let a, let b) where a == b:
    // 値が同じとき (where によるオプション条件)
    break;
case (-10...10,-10...10):
    //-10と10以内の値
    break;
default:
    print("unko");
}

forループ

// 以前までの下記のようなコードは使えなくなりました。
for (var i = 0; i < 8; i++) {
    print(i)
}
// 代わりにこちらを使います。
for var i in 0 ..< 8 {
    print(i)
}

for in 配列

for (変数 in 配列) {
}

for in 辞書

let 辞書 = ["hoge": "hogehogehoge"]
for (key, value) in 辞書 {
    print("\(key) - \(value)")
}

whileループ

while (比較) {
    // 比較が true のときループ
}

do {
    // 一回とりあえず実行してループ
} while (比較)

関数

func sum(a:Int, b:Int) -> Int {
    return a + b;
}

// 返り値がタプル タプルの中は別の型でも可
func getCoupleName() -> (String, String) {
    return ("tom", "jerry")
}
var (person1, person2) = getCoupleName();

// 引数が可変長
func trace(args: Any...) {
    for arg in args {
        print(arg)
    }
}
trace(args: "unko", "unko", "unko", 1, 2, 3.0, -1);

クラス

class Color {
    var r:Double = 0.0, g:Double = 0.0, b:Double = 0.0
    
    // イニシャライザ
    init(r: Double, g:Double, b:Double) {
        self.r = r;
        self.g = g;
        self.b = b;
    }
    
    func description() -> String {
        return "\(r) \(g) \(b)"
    }
}
let redColor = Color(r: 1, g:0, b:0);
print(redColor.description())