Last active
May 25, 2016 01:23
-
-
Save externvoid/f32c33645de6ece368ff2f0116a9b5f2 to your computer and use it in GitHub Desktop.
compareメソッドの使い方が良く判らん⁉️ ▶️ 判った、昇順降順を判断して返してくれるって事だ。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| var ar2:Array<NSString> = ["aaa", "bbb", "abc",] | |
| var strings:NSMutableArray = NSMutableArray(array: ar2) | |
| print(strings) | |
| strings.sortUsingComparator( { | |
| return $1.compare($0 as String) | |
| } ) | |
| //error: 'AnyObject' is not convertible to 'String'; did you mean to use 'as!' to force downcast? | |
| // return $1.compare($0 as String) | |
| // ~~~^~~~~~~~~ | |
| // as! | |
| strings.sortUsingComparator( { | |
| return $1.compare($0) | |
| } ) | |
| //error: cannot invoke 'compare' with an argument list of type '(AnyObject)' | |
| // return $1.compare($0) | |
| // ^ | |
| // compareメソッドの引数は適当にキャストが必要、例えば、as! Stringって感じ! | |
| //note: overloads for 'compare' exist with these partially matching parameter lists: (NSNumber), (String), (NSDate), (NSIndexPath) | |
| // return $1.compare($0) | |
| // ^ | |
| var strings = ["aaa", "bbb", "abc",] | |
| strings.sortUsingComparator( { | |
| return $1.compare($0 as! String) | |
| } ) | |
| //error: value of type '[String]' has no member 'sortUsingComparator' | |
| //sortUsingComparatorメソッドを使うには配列はArray<String>, Array<NSString>ではNG⁉️ | |
| var ar2:Array<NSString> = ["aaa", "bbb", "abc",] | |
| var strings:NSMutableArray = NSMutableArray(array: ar2) | |
| print(strings) | |
| strings.sortUsingComparator( { | |
| return $1.compare($0 as! String) | |
| } ) | |
| print(strings) | |
| //( | |
| // aaa, | |
| // bbb, | |
| // abc | |
| //) | |
| //( | |
| // bbb, | |
| // abc, | |
| // aaa | |
| //) | |
| // |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
⭕️sortUsingComparatorに与えるブロックはどう設計すべきなのか?
date1, date2の並び順をブロックもそのまま返せば、配列はAscendingに並ぶ。
例:date1, date2の値が13:37, 10:25だとする。この並びはDecendingなので、そのままブロックもDecendingを返せば、配列はAscending(10:25, 13:37, …)へと破壊的に再構成される。
並び順をブロックがひっくり返すと配列はDecendingに並ぶ。
ブロックがAscendingを返せば、配列はDecendingへと破壊的に再構成される。
⭕️ compareメソッドの動作(HKQuantity, NSDate, NSDecimalNumber, NSIndexPath, NSNumber, NSStringがcompareメソッドを実装している)
obj1.compare(obj2)は、obj1 < obj2ならAscendingを返す。
NSComparisonResultを返すのがこのメソッドの特徴
⭕️オブジェクトが格納された配列の中身をソートしたい。
▶️ 配列にはNSMutableArrayを使う。
sortUsingComparatorメソッドはNSComparatorブロックを受け取る。ブロックは、NSComparisonResultが返る様に設計する。NSDate型だと、NSComparisonResultを返すcompareっていうメソッドが内蔵されている。だから、配列に格納されているのがNSDateなら、話は楽だ。
⭕️compareメソッドは自作できる。
“03/18”.compare(“03/19”)は.OrderedAscendingを返す。
1, 2, 3の様に階段を登るが如く昇順に並んでいるからだ。
一般にオブジェクトの並びが昇順とは、obj1, obj2, obj3と並べた時に、obj1 < obj2 < obj3となっているという事だ。
”03/18” < “03/19”なので、“03/18”.compare(“03/19”)は.OrderedAscendingを返す。
obj1.compare(obj2)が.OrderedAscendingを返す時は、obj1 < obj2だという事だ。