Skip to content

Instantly share code, notes, and snippets.

@externvoid
Last active May 25, 2016 01:23
Show Gist options
  • Select an option

  • Save externvoid/f32c33645de6ece368ff2f0116a9b5f2 to your computer and use it in GitHub Desktop.

Select an option

Save externvoid/f32c33645de6ece368ff2f0116a9b5f2 to your computer and use it in GitHub Desktop.
compareメソッドの使い方が良く判らん⁉️▶️判った、昇順降順を判断して返してくれるって事だ。
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
//)
//
@externvoid

externvoid commented May 25, 2016 •

Copy link
Copy Markdown
Author

⭕️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だという事だ。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment