#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 と表示される



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS