#author("2016-05-14T11:54:13+00:00","default:nitta","nitta") #author("2016-05-25T05:51:35+00:00","default:nitta","nitta") [[Swift]] このページは以下の本を参考にしています。 詳細Swift改訂版 著者: 荻原剛志 出版社: SBクリエイティブ株式会社 (2016/01/01) ISBN: 978-4-7973-8625-7 http://isbn.sbcr.jp/86257/ *Swift/ジェネリクス [#rafbaa30] ジェネリクス(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] となる。 **型パラメータの書き方 [#e9f1cbe5] <T> <T,U> <T: OtherType> <... where 条件> 条件は "," で区切って並べることで AND 条件となる。 T: OtherType --- 型Tは型OtherTypeと同じか、Oそのサプクラスであるか? T == U --- 型Tは型Uと同じか? **型パラメータの推論 [#b68583cb] ジェネリック関数を使用するとき、型パラメータを明示的に記述することはできない。 引数や返り値から推測される。 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"] ***関数の引数とタプル [#ua7d4a04] 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 と表示される