まあかなり簡単なやり方ですが、慣れてくると結構便利なのでメモとして残しておきます。
まずmap
メソッドを簡単に説明しますと、最近は多くの言語は配列に「map
」というやらを対応しています。簡単に言うと配列の要素を何かしら弄って返すメソッドです。例えば 0 から 9 までの自然数の配列があるとしますが、その配列の要素の自乗した配列がほしい、という場合は昔 C 言語の時代はこんな風に書きます
int arrayA[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int arrayB[10];
for (int i = 0; i < 10; i++) {
arrayB[i] = arrayA[i] * arrayA[i];
}
まあこのコード自体はとてもシンプルですが、一応「C の文法がわからない!」という方のために同じ動作の Swift のコードを書きます:
let arrayA = [Int](0 ..< 10)
var arrayB = [Int]()
for element in arrayA {
arrayB.append(element * element)
}
(まあこの段階でも C と比べると更にだいぶシンプルになりましたね…もう Swift なれちゃった筆者はもう C でソースコード書きたくないでございます orz)
もちろんこの書き方自体も全然悪くないのですが、map
メソッドを使うと更にシンプルに書けちゃうのです:
let arrayA = [Int](0 ..< 10)
let arrayB = arrayA.map{$0 * $0}
というかもはや「なにこれ気持ち悪っ!」ってレベルの簡潔さですね、はい。そしてやっぱとまあ、let
使える時はlet
使ったほうが気持ちいいですよね(笑)map
メソッドの簡単な紹介はこれくらいにします、ここからが本題です。実は自乗なんて生ぬるいものだけでなく、そもそも違う型で出力することだってできちゃうのです。例えばこれの平方根を取りたいとするでしょう、でもInt
型じゃあ小数取れないでしょう、そういう時はこのように書けます:
let arrayA = [Int](0 ..< 10)
let arrayB = arrayA.map{ (element: Int) -> Double in
let value = sqrt(Double(element))
return value
}
こうするとDouble
型のarrayB
が生成され、arrayA
の各要素の平方根が入ります。書き方について詳しい説明は省きますが、要するにmap
メソッドの中身はクロージャを打ち込むことで中身を色々操作して新しい配列として吐き出してくれるというわけですよ。
んで実は筆者の場合、こういう使い方よりも、一度に複数のUIView
オブジェクトをUIViewAnimation
に渡したいときに使ったりしますね。例えばもうズバリ書いちゃいます:
let baseView = UIView(frame: CGRectMake(0, 0, 1920, 1080))
let viewTags = [Int](0 ..< 10)
for tag in viewTags {
let view = UIView(frame: baseView.frame)
view.tag = tag
baseView.addSubview(view)
}
//いろいろ操作
let animationViews = viewTags.filter{$0 % 3 == 0}.map{ (tag: Int) -> UIView in
let view = baseView.viewWithTag(tag)!
return view
}
UIView.animateWithDuration(1.5, animations: { () -> Void in
for view in animationViews {
view.alpha = 0
}
})
まあ詳しい説明は省きますが、要するにbaseView
を作ってその上に順番に tag が 0 から 9 までのUIView
を重ねていきます。そして途中は省略してますが、最後 tag が 3 の倍数のUIVew
だけフェードアウトさせる、というプロセスです。