2014-10-26 9 views
43

द्वारा NSManagedObject सबक्लास के उदाहरण वाले एक स्विफ्ट सरणी को सॉर्ट कैसे करूं, मैं the accepted answer to this question में रखे गए सरणी को सॉर्ट करने का प्रयास कर रहा हूं, लेकिन उस समस्या में भाग रहा हूं जिस पर इसुरु ने टिप्पणियों में उल्लेख किया है जवाब।मैं एक विशेषता मूल्य (दिनांक)

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; 
    } 
} 

और: अर्थात्, कोड जो इकाई का "अब तक" विशेषता के आधार सरणी सॉर्ट चाहिए NSManagedObject उपवर्ग इकाई का वर्णन संकलक शिकायत लाता है "सदस्य नहीं पा सके 'तारीख'"

यहाँ

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 
}() 

ध्यान दें कि कि कोड के उत्तरार्द्ध में, मैं प्रविष्टियों में से एक के लिए पहुँच सकते हैं और "तिथि" संपत्ति लॉग इन करने में सक्षम हूँ, और संकलक नहीं करता है: यहाँ कोड है जो सरणी सॉर्ट करने के लिए कोशिश करता है इसके साथ कोई समस्या नहीं है।

क्या मेरा सिंटैक्स सही क्रमबद्ध करने के लिए है? क्या इस कोड के साथ कोई और मुद्दा है जिसे मैं नहीं देख रहा हूं?

उत्तर

124

यह आंशिक रूप से स्विफ्ट कंपाइलर के साथ एक समस्या है जो आपको एक सहायक त्रुटि नहीं दे रहा है। असली मुद्दा यह है कि 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 { } 

नोट: आप केवल < औरलागू करने की आवश्यकताऔर ऊपर दिखाया गया है, तो बाकी ऑपरेटरों <=, >, आदि मानक पुस्तकालय द्वारा प्रदान किए जाएंगे।

उस जगह में साथ

, अपने मूल प्रकार समारोह ठीक काम करना चाहिए:

let aDate = Date() 
let bDate = Date() 

if aDate < bDate { 

    print("ok") 
} 

पुरानी स्विफ्ट:

days.sort({ $0.date < $1.date }) 
+0

यह डेटा की छोटी मात्रा के लिए पूरी तरह से काम करता है लेकिन जब आपके पास बड़ी मात्रा में लोड होने में कुछ समय लगता है। क्या एक और अधिक कुशल विधि है? – nsij22

+0

@ nsij22 क्योंकि हम यहां 'एनएसएमएनेज ऑब्जेक्ट' की बात कर रहे हैं, तो वे ऑब्जेक्ट्स कोर डेटा स्टोर से आ रहे हैं।उस स्थिति में, संभवतः कोर डेटा लाने के अनुरोध के माध्यम से डेटा को सॉर्ट करना सबसे प्रभावी काम है। 'NSFetchRequest.sortDescriptors' पर एक नज़र डालें: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/index.html#//apple_ref/occ/instp/NSFetchRequest/ sortDescriptors –

16

स्विफ्ट 3 में, दिनांक अब सीधे तुलनीय हैं एक वैकल्पिक होगा समय वस्तु को इंगित करने के लिए तिथि वस्तु की अंतराल Since1970 संपत्ति, जो सीधे तुलनीय है।

days.sort({$0.date.timeIntervalSince1970 < $1.date.timeIntervalSince1970}) 
+0

मुझे नहीं पता कि यह स्वीकार्य समाधान क्यों नहीं है –

+0

मैंने केवल तब ही सोचा जब मुझे एक ही चीज़ की आवश्यकता थी और स्वीकार किए गए उत्तर की पहली वाक्य देखी गई, जो स्वीकार्य उत्तर पोस्ट किए जाने के बाद काफी बाद में था। –

10

swift2.1 उपयोग में कोड

array.sortInPlace({ $0.date.compare($1.date) == NSComparisonResult.OrderedAscending }) 
0

मैं एक शब्दकोश जिसका कुंजी तिथि प्रारूप में हैं तो मैं तिथि के अनुसार शब्दकोश सॉर्ट करने के लिए केवल सहायता की जरूरत के इस लाइनों। मैंने 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) 
संबंधित मुद्दे