8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【初心者向け?】map メソッドで既存配列から違う型の配列を作る方法

Last updated at Posted at 2015-03-19

まあかなり簡単なやり方ですが、慣れてくると結構便利なのでメモとして残しておきます。

まず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だけフェードアウトさせる、というプロセスです。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?