【Swift】CGFloat型の配列をsortする方法。(CGFloat、辞書型配列の説明を含む)
今回の記事はSwiftの座標表示の1パターンの配列をsortした話です。
数字ならなんでもsortできるんじゃとか考えている様では甘いです。
CGFloatは数字ではなく座標を表す数値ですのでなんとsortが普通ではできません。
この記事中にCGFloatを含む座標系の解説と辞書型配列についても解説していきます。
Swiftの座標系とは(CGRect、CGSize、CGPoint)
そもそも座標系とは何かというと少数で表される数字であることは違いないのですが、IntやFloatとはメソッドが違うため座標系の配列をsortしようとしても単純にsortではエラーになってしまします。
そのため、座ヒュおけいからFloat型に一度変換を行い、そのごsortを行うという一手間をかける必要があります。
下記は座標系の基本的な使い方です。
CGRect
CGFloatは座標系の中でも一番便利じゃないかと思われるものです。(X座標、Y座標、width幅、height高)さの4つの要素がrectで定義した座標領域に含まれています。

CGRect rect = CGRectMake(10, 20, 100, 80);
print(rect.origin.x)//10
print(rect.origin.y)//20
print(rect.size.width)//100
print(rect.size.height)//80
//CGRectの領域作成、かく要素がそれぞれの座標などを表している。
CGRect rect = CGRectZero;
//初期化
CGSize
対象のObjectbuttonとかに対して使用するもので幅と高さの指定ができるメソッドです。

CGSize size = CGSizeMake(100, 50);
// CGSizeの生成
print(size.width)//100
print(size.height)//50
CGPoint

先ほどのCGRectの幅高さの指定がないバージョンです。
純粋な座標を表す際に使用します。
CGPoint point = CGPointMake(200, 300);
//座標の定義
print(point.x)//200
print(point.y)//300
この様に座標系というのはあくまでも対象や領域に関連する座標と長さを表しているものですので数値とは違います。
そしてここまで読んだ際に感じた人がいると思いますがCGFloat型の配列って要はCGRectでできてんじゃ?と感じた人。正解です。
本来はRectに座標、幅高さを格納させて使用したところなのですが、そのままではRectの要素がたくさんある場合X座標が小さい方から並べるなどの操作ができないのです。
その為に今回の記事があるという感じです。
その前に辞書型配列についての記事です。
swiftにそこまで詳しくない上に辞書型の配列はできるだけさけて、Array型の配列を使用してきた人生なのでこの子に記事を備忘録として、以後忘れない様にしていこうと思っております。
辞書型配列とは?
通常のよく見る配列は下記のArray型ではないでしょうか?
var test_array:[Int] = []
test_array = [1,2,3,4,5]
この配列は要素が一つずつになっておりますが、辞書型の配列の場合は、以下の様になっており、違いがあります。
var test_dict:[Int:String] = [:]
test_dict = [1:"test1" ,2:"test2"]
この様にkey、valueの組み合わせの配列になっております。
この様に目的を持って1はtest1を格納しているとうの配列があるのであれば使用する際も良いのですが、APIの利用時や既存コードの改修を行う際にどの様な目的があってこの配列を使用しているのかがなかなかわかりづらいと私は考えております。
まあ玄人にはこちらの方がわかりやすいのか?笑(単に私の実力不足)
本題のCGFloatの配列をsortする方法。
いよいよこの記事の本題にあたる部分なのですが、まずsort対象の配列を下記にします。
var CGFloat_Array:[[CGFloat]] = [[1.2,1.3,1.4,1.5],[1.0,1.3,1.4,1.5],[1.1,1.3,1.4,1.5]]
//x座標にあたる0番目のかく配列要素をsortを小さい方から順番に並べるためにsortする
まず上記の配列を作る際にFloat型で全てappendします。
これで作成された配列はCGFloat型ではなくFloat型になっているはずです。下記がその配列。
var cgfloat:[[Float]] = [[1.2,1.3,1.4,1.5],[1.0,1.3,1.4,1.5],[1.1,1.3,1.4,1.5]]
これを利用して辞書型配列を作成します。
var cgfloat_dict:[Float:Array[Float]] = [1,2:[1.2,1.3,1.4,1.5],1.0:[1.0,1.3,1.4,1.5],1.1:[1.1,1.3,1.4,1.5]]
//この辞書型配列はX座標のFloat型要素をkeyに、CGRectのFloat型変換した要素配列をvalueにして辞書型配列を作成しております。
これと同じ様にもう一つsort用のArray配列を作成します。
var list:Float = [1.2,1.0,1.1]
//これは上記の配列をappendする際に同じタイミングで今回のsortに使う要素(x座標)で配列を準備すれば作成できます。
次にこのsort用の配列をsortします。
var sort_list = list.sorted()
これができればあとは辞書型配列の特性とfor文を利用して値を取っていきます。
print(list)
print(sort_list)
//ソートしていない場合
for not_sort in list {
print(cgfloat_dict.key(not_sort))
}
//ソートした場合
for sort in sort_list {
print(cgfloat_dict.key(sort))
}
こんな感じで一手間かかりますがfloat配列をx座標の小さい方から順番に並べるまででした。
コメント