Swift

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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-05-25 (水) 14:51:35 (1474d)