Swift/ジェネリクス †ジェネリクス(generics)とは、型をパラメータとしてプログラムを記述するための機能。 //関数 swap は、任意の型 T について、T型のinout引数を2つ取り、値を返さない func swap<T>(inout a: T, inout _ b: T) { // Tは型パラメータ(type parameter) let t = a; a = b; b = t; } var a:Int = 2, b:Int = 5 swap(&a,&b) // a=2, b=5となる。 var s:String ="Alice", t:String = "Bob" swap(&s,&t) // s = "Bob", t = "Alice" となる。 var v = ((2, 3), 9, (88, 108)) swap(&v.0, &v.2); // v = ((88, 108), 9, (2, 3)) となる。 func +<Key,Value>(lhs:[Key:Value],rhs:[Key:Value]) -> [Key:Value] { var dic = lhs for (k,v) in rhs { dic[k] = v } return dic } let p = ["レベル":60, "特技":10] let q = ["番号":1] let t = p + q; // t = [["番号":1, "レベル":60, "特技":10] となる。 型パラメータの書き方 †<T> <T,U> <T: OtherType> <... where 条件> 条件は "," で区切って並べることで AND 条件となる。 T: OtherType --- 型Tは型OtherTypeと同じか、Oそのサプクラスであるか? T == U --- 型Tは型Uと同じか? 型パラメータの推論 †ジェネリック関数を使用するとき、型パラメータを明示的に記述することはできない。 引数や返り値から推測される。 func f<T>(n:Int) -> [T?] { return [T?](count:n, repeatedValue: nil) } let a = f(3) // エラー。型を推測できないので。 let b:[Int?] = f(3) // [nil, nil, nil] let c = f(2) + ["abc"] // [nil, nil, "abc"] 関数の引数とタプル †func apply<T,U>(f:(T)->U, _ t:T) { return f(t) } func spell() { print("void") } func spell(a:Int) { print(a) } func spell(a:Int, b:String) { print("\(a) \(b)") } func spell(a:Int, b:String, c:Int) { print("\(a) \(b) \(c)") } apply(spell,()) // void と表示される apply(spell,1) // 1 と表示される apply(spell,(2,"abc")) // 2 abc と表示される apply(spell,(3,"abc",4)) // 3 abc 4 と表示される |