2014-07-02 13 views
14

मैं एक क्लास फ़ंक्शन लिखना चाहता हूं, जो कक्षा प्रकार की एक सरणी वापस कर देगा। जहां तक ​​मैं समझ गया, मैं उद्देश्य-सी "इंस्टेंस टाइप" के लिए "सेल्फ" का उपयोग कर सकता हूं। मेरा लक्ष्य एक fetchObjects विधि के साथ एक NSManagedObject के लिए एक एक्सटेंशन बनाना है। यह विधि NSManagedObject उप-वर्गों की एक सरणी वापस करने की तुलना में होगी।स्विफ्ट: प्रकार के आरे का प्रकार स्वयं

extension NSManagedObject { 

    class func fetchObjects(entity: String, context: NSManagedObjectContext, predicate: NSPredicate?, sortDescriptors: NSSortDescriptor[]?) -> Self[] { 
     // can't define return type of an array with type Self 
     // also var declaration does not work 
     var objects : Self[]? 

     return objects 
    } 
} 

किसी भी विचार कैसे मैं प्रकार स्व की एक सरणी को परिभाषित कर सकते हैं: यहाँ मेरी छद्म कोड का एक उदाहरण है जो संकलन नहीं करता है?

किसी भी मदद के लिए धन्यवाद!

+0

आप इस तरह के फ़ंक्शन को पैरामीटर कर सकते हैं: 'क्लास फंड fetchObjects (...) -> स्वयं []?' लेकिन मुझे नहीं लगता कि आप ओबीजेसी से स्विफ्ट तक ब्रिजिंग जेनरेट कर सकते हैं, जैसे कि कंपाइलर कर सकता है गारंटी है कि प्रत्येक एनएसएमएनेज ऑब्जेक्ट के लिए एक संबंधित स्विफ्ट ऑब्जेक्ट होने वाला है। हालांकि, यह बहुत अच्छा सवाल होगा। – Brett

+0

बस स्पष्ट होने के लिए, आप 'सबक्लास' की एक सरणी नहीं ढूंढ रहे हैं, आप ऐसे नामों के साथ उदाहरणों की एक सरणी ढूंढ रहे हैं जो एक नामित सुपरक्लास के उप-वर्ग हैं? – GoZoner

+0

हां, जो मैं प्राप्त करना चाहता हूं, इसलिए यदि मैं इसे एनएसएमएनेज्ड ऑब्जेक्ट सबक्लास पर कॉल करता हूं और यह इस सबक्लास – user966697

उत्तर

9

यह एक समान कार्य के लिए मैं जो उपयोग करता हूं उसका जस्ट है, ध्यान दें कि यह NSManagedObject के बजाय NSManagedObjectContext पर एक विस्तार है।

extension NSManagedObject : NamedManagedObject { 
    class func entityName() -> String { 
     return NSStringFromClass(self) 
    } 
} 

हैं: है कि आप भी साथ सभी NSManagedObjects के लिए NamedManagedObject लागू कर सकते हैं

let objects = managedObjectContext.fetchObjects(MyObjectClass) 

नोट: कुछ इसी तरह शायद तब यह जितना आसान है का उपयोग कर NSManagedObject

protocol NamedManagedObject { 

    class func entityName() -> String; 

} 

extension NSManagedObjectContext { 

    func fetchObjects<T:NSManagedObject where T:NamedManagedObject>(entity:T.Type, predicate:NSPredicate? = nil, sortDescriptors:NSSortDescriptor[]? = nil) -> T[]? { 
     let request = NSFetchRequest(entityName: entity.entityName()) 

     request.predicate = predicate 
     request.sortDescriptors = sortDescriptors 

     var error:NSError? = nil 
     let results = self.executeFetchRequest(request, error: &error) as? T[] 

     assert(error == nil) 

     return results 
    } 

} 

extension MyObjectClass : NamedManagedObject { 
    class func entityName() -> String { 
     return "MyObjectClass" 
    } 
} 

पर किया जा सकता है आप यह भी बीमा करते हैं कि आपके सभी वर्गों को स्पष्ट रूप से उद्देश्य-सी अनुकूल नाम दिए गए हैं:

@objc(MyManagedObject) 
class MyManagedObject : NSManagedObject { ... } 
+0

बढ़िया! "टाइप" चीज वह है जो मैंने भी देखी थी। असल में आप पहले जैसा ही करना चाहते थे;) – user966697

संबंधित मुद्दे