この質問に対する受け入れられた答え にあるように配列をソートしようとしていますが、その答えのコメントでIsuruが言及している問題に直面しています。つまり、エンティティの「日付」属性で配列をソートする必要があるコードは、コンパイラーの苦情「メンバー '日付'が見つかりませんでした」をもたらします。
エンティティを記述するNSManagedObjectサブクラスは次のとおりです。
import Foundation
import CoreData
@objc(Entry)
class Entry: NSManagedObject {
@NSManaged var date: NSDate
@NSManaged var reflections: AnyObject
@NSManaged var contactComment: NSSet
@NSManaged var person: NSSet
override func awakeFromInsert() {
let now:NSDate = NSDate()
self.date = now;
}
}
そして、配列をソートしようとするコードは次のとおりです。
lazy var entries:[Entry] = {
var days:[Entry] = self.managedObjectContext!.requestEntity("Entry")as [Entry]
days.sort({$0.date < $1.date})
var today:Entry = days.last!
println(today.date)
return days
}()
そのコードの後半では、エントリの1つの「日付」プロパティにアクセスしてログを記録できますが、コンパイラには問題がありません。
ソートの構文は正しいですか?私が見ていないこのコードには別の問題がありますか?
これは部分的にSwiftコンパイラーが有用なエラーを出さない問題です。実際の問題は、NSDate
を_<
_と直接比較できないことです。 、次のようにNSDate
のcompare
メソッドを使用できます。
_days.sort({ $0.date.compare($1.date) == NSComparisonResult.OrderedAscending })
_
または、NSDate
を拡張してComparable
プロトコルを実装し、_<
_(および_<=
_、_>
_、_>=
_、_==
_):
_public func <(a: NSDate, b: NSDate) -> Bool {
return a.compare(b) == NSComparisonResult.OrderedAscending
}
public func ==(a: NSDate, b: NSDate) -> Bool {
return a.compare(b) == NSComparisonResult.OrderedSame
}
extension NSDate: Comparable { }
_
注: _<
_および_==
_を実装する必要があり、上記に示した残りの演算子_<=
_、_>
_などは標準ライブラリによって提供されます。
これが適切であれば、元のソート関数は正常に機能するはずです。
_days.sort({ $0.date < $1.date })
_
Swift 3では、日付は直接比較可能になりました:
let aDate = Date()
let bDate = Date()
if aDate < bDate {
print("ok")
}
Old Swift:別の方法は、日付オブジェクトのtimeIntervalSince1970プロパティでソートすることです。これは直接比較できます。
days.sort({$0.date.timeIntervalSince1970 < $1.date.timeIntervalSince1970})
Swift2.1
このコード行を使用
array.sortInPlace({ $0.date.compare($1.date) == NSComparisonResult.OrderedAscending })
Update__ Swift 4、
let sortedData = dataToSort.sorted(by: { (obj1, obj2) -> Bool in
return obj1.date < obj2. date
})
キーが日付形式である辞書が1つあるため、日付で辞書をソートする必要があります。 nsarrayのすべてのキーをコピーし、次のコードを使用してその配列を並べ替えました。
let keys : NSArray = stackedBarDataDict.allKeys // stackedBarDataDict is Data Dictionary
let dataArray = NSMutableArray()
for index in 0...(stackedBarDataDict.allKeys.count - 1)
{
let dateone = keys.objectAtIndex(index)
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let date1 = dateFormatter.dateFromString(dateone as! String)
dataArray.addObject(date1!)
}
let array : NSArray = (dataArray as NSArray)
let sortedArray = array.sortedArrayUsingComparator {
(obj1, obj2) -> NSComparisonResult in
let p1 = obj1 as! NSDate
let p2 = obj2 as! NSDate
let result = p1.compare(p2)
return result
}
print(sortedArray)