-->

Swift

複数の値をひとまとめにする機能だ。

let hoge = ("あ", 1)

println(hoge.0)    // "あ"と表示
println(hoge.1)    // "1"と表示

hoge.0、hoge.1でそれぞれの値を参照できる。
hogeは型推論を使っているが、あえて書くと次のようになる。

let hoge:(String, Int) = ("あ", 1)

タプルをバラバラに変数に代入する。

let hoge = ("あ", 1)
let (v1, v2) = hoge
let (v3, _) = hoge   // 1の方が必要なければ"_"(ワイルドカード)を指定しておく

println(v1)    // "あ"と表示
println(v2)    // "1"と表示
println(v3)    // "あ"と表示

hoge.0やhoge.1じゃなく名前で参照することもできる。

let hoge = (str:"あ", num:1)

println(hoge.str)    // "あ"と表示
println(hoge.num)    // "1"と表示

このエントリーをはてなブックマークに追加

C言語のtypedefみたいなもんだ。
型に別名を与えることができる。

typealias hoge = Int
var a:hoge = 10

このエントリーをはてなブックマークに追加

関数は、"func 関数名(引数リスト)->戻り値型{...}"で定義する。引数リストは、"変数名:型"をカンマ区切りで指定する。

func plus(num1:Int, num2:Int) -> Int {
    return num1 + num2
}

println("1+1=\(plus(1,1))")     // "1+1=2"と表示

可変引数は、"nums:Int..."のように指定する。numsは配列になっていて次のように引数を扱える。

func printNums(nums:Int...)->Void {
    for num in nums {
        println(num)
    }
}

printNums(1,2,3,4,5)
// 1
// 2
// 3
// 4
// 5
// って表示される

関数はファーストクラスオブジェクトで数値と同じように関数の戻り値や引数に指定できる。

// plus関数を返す関数を定義
func makePlus()->((Int, Int)->Int) {
    func plus(num1:Int, num2:Int)->Int {
        return num1 + num2
    }
    return plus     // 関数を返す。
}
var plus = makePlus()

println("1+1=\(plus(1,1))")     // "1+1=2"と表示

関数に引数で関数をわたす例

func plus(num1:Int, num2:Int)->Int {
    return num1 + num2
}

func reduce(nums:[Int], calc:((Int,Int)->Int))->Int? {
    if nums.count == 0 {
        return nil
    }
    var ret = nums[0]
    for var i = 1; i < nums.count; i++ {
        ret = calc(ret, nums[i])
    }
    return ret
}

var sumOpt = reduce([1,2,3,4,5,6,7,8,9,10], plus)
if let sum = sumOpt {
    println("1~10の合計:\(sum)")       // "1~10の合計:55"と表示
} else {
    println("エラー")
}

そーいや、↑で使ったがOptional型についてまだ書いてないな。


このエントリーをはてなブックマークに追加

switch文もC言語なんかと似ている。次のような感じだ。

let hoge = 10
var msg:String

switch hoge {
case 1:
    msg = "hogeは1"
case 10:
    msg = "hogeは10"
default:
    msg = "hogeは1,10以外"
}

println(msg)    // "hogeは10"と表示

if文とかと同様に、switch文の後の()はいらない。case文の最後のbreakは必要ない。(書いてもいい)あと、文字列変数でも条件わけできる。
C言語でbreakを書かなかった場合と同じ動作をするには、fallthroughを書く。
こんな感じだ。

let hoge = 10
var msg:String

switch hoge {
case 1:
    println("hogeは1")
    break   // ←書いてもいい
case 10:
    println("hogeは10")
    fallthrough
default:
    println("hogeは1,10以外")
}

// これを実行すると、
// hogeは10
// hogeは1,10以外
// と表示される。

caseで複数条件を指定するには、","で区切って指定する。

let hoge = 10
var msg:String

switch hoge {
case 1, 10:
    msg = "hogeは1または10"
case 2:
    msg = "hogeは2"
default:
    msg = "hogeは1,2,10以外"
}

println(msg)    // "hogeは1または10"と表示

whereを使ってパターンマッチも可能。

let hoge = 6
var msg:String

switch hoge {
case let x where x < 5:
    msg = "hogeは5未満"
case let x where x >= 5 && x < 10:
    msg = "hogeは5以上,10未満"
default:
    msg = "hogeは10以上"
}

println(msg)    // "hogeは5以上,10未満"と表示

いったんletで指定した変数に代入して、その変数で比較するような感じだ。

あと、Swiftのswitch文は、条件の網羅性のチェックが行われる。例であげたソースのdefault部分をコメントアウトするとエラーになる。


このエントリーをはてなブックマークに追加

if文

let a = 10
if a == 10 {
    println("真")
} else {
    println("偽")
}

C言語と違って、if文のあとを()で書こう必要がない。ifのあとの式は、結果Bool型かBooleanTypeプロトコルを実装したクラスのオブジェクトでないといけない。

for文

let hoge = [1, 2, 3]

// 配列一覧表示
for var i = 0; i < hoge.count; i++ {
    println(i)
}

// 他の言語であるforerach文
for i in hoge {
    println(i)
}

// Range指定でループ
// 1〜5まで表示される
for i in 1...5 {
    println(i)
}
// 1〜4まで表示される。
for i in 1..<5 {
    println(i)
}

// 辞書を一覧表示
let hoge2 = [
    "key1":1,
    "key2":2,
    "key3":3,
]
for (key, val) in hoge2 {
    println("key=\(key),val=\(val)")
}

if文と同じように()が必要ない。

while、do〜while文

var n = 1
while n < 10 {
    println(n)
    n++
}

n = 1
do {
    println(n)
    n++
} while n < 10

C言語なんかといっしょ。if文と同じように()が必要ない。

あと、switchがあるが、またこんど。


このエントリーをはてなブックマークに追加

↑このページのトップヘ