2014-07-02 43 views
14

Sınıf türünde bir dizi döndürecek bir sınıf işlevi yazmak istiyorum. Anladığım kadarıyla, "instanceType" objesi için "Kendi" yi kullanabilirim. Amacım, bir fetchObjects yöntemiyle bir NSManagedObject uzantısı oluşturmaktır. Bu yöntem, bir dizi NSManagedObject alt sınıflarını döndürecektir.Swift: return Kendiliğinden türünün özeti

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

i tip Öz dizisi tanımlayabiliriz konusunda bir fikrin: Burada derleme değil benim sözde kodunun bir örnektir?

Yardımlarınız için teşekkürler!

+0

İşlev şu şekilde parametre atayabilirsiniz: 'class fund fetchObjects (...) -> Self []?' Ancak derlemeyi ObjC'den Swift'e, yani derleyicinin Her NSManagedObject için karşılık gelen Swift nesnesi olacağını garanti eder. Yine de harika bir soru olurdu. – Brett

+0

Sadece açık olmak gerekirse, bir 'alt sınıflar' dizisi aramıyorsunuz, adlandırılmış bir süper sınıfın alt sınıfı olan türlere ait bir dizi örnek arıyorsunuz? – GoZoner

+0

Evet, başarmak istediklerim var, bu yüzden bir NSManagedObject alt sınıfı olarak adlandırırsanız ve bu alt sınıfın bir örneğini döndürürse – user966697

cevap

9

Benzer bir işlev için kullandığım şeyin özü, NSManagedObject yerine NSManagedObjectContext adresinde bir uzantı olduğunu unutmayın.

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

ise: Ayrıca tüm NSManagedObjects için NamedManagedObject uygulamak anlamına

let objects = managedObjectContext.fetchObjects(MyObjectClass) 

Not: Benzer bir olasılıkla Sonra kadar basittir kullanılarak 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" 
    } 
} 

üzerinde yapılabilir Ayrıca, tüm sınıflarınızın açık bir şekilde Objective-C dostu isimler verdiğinden emin olursunuz:

+0

Harika! ".Type" şey de benim aradığım şey. Aslında seninle aynı şeyi yapmak istedim;) – user966697