2016-05-18 4 views
0

Я пытаюсь создать универсальную функцию в расширении класса, но получаю ошибку компилятора.Быстрая общая функция

У меня тоже классов А и В, как расширение NSManagedObject

Я хочу создать findOne() функцию в моем расширении класса.

extension NSManagedObject { 
    public class func findOne() -> NSManagedObject { 
    // some working stuff returning a NSManagedObject 
    } 
} 

Моей проблема: Когда я использую этот метод А, типа возвращаемого значение NSManagedObject

let aObject = A.findOne //type is NSManagedObject 

Таким образом, очевидно, что я могу бросить его и получить объект класса А

let aObject = A.findOne as! A//type is NSManagedObject 

Начиная с этого момента, я хочу заменить свою реализацию расширения, чтобы использовать общий, что делает меня:

let aObject = A.findOne //type is A 

Я попытался это:

extension NSManagedObject { 
    public class func findOne<T>() -> T { 
    // some working stuff returning a NSManagedObject 
    } 
} 

Но A.findOne() еще NSManagedObject типа.

Может ли кто-нибудь мне помочь?

UPDATE Этот код на самом деле работает, если я использую:

class func findOne<T : NSManagedObject>() -> T { 
    //Do some stuff 
    return myObject as! T 
} 

let myObject : A = A.findOne() 
+0

вы можете использовать 'Self' в качестве возвращаемого типа. – luk2302

+0

Сравните [Как создать экземпляры подклассов управляемого объекта в расширении NSManagedObject Swift?] (Http://stackoverflow.com/questions/27109268/how-can-i-create-instances-of-managed-object-subclasses- в-nsmanagedobject-SWI). –

+0

@Alessandro: Почему вы добавили «OS X» в заголовок и теги? Основные данные существуют и в iOS, и ничто в этом вопросе не относится к OS X. –

ответ

0

Вы можете создать BaseModel, что все ваши модели унаследует от. Используйте параметр универсального типа для приведения объекта в соответствии

class BaseModel : NSManagedObject { 

    class func find<T>(objectID: NSManagedObjectID) -> T 
    { 
     return someObjectContext.objectWithID(objectID) as! T 
    } 
} 

class Person : BaseModel { 

} 


let person: Person = Person.find(someObjectId) 

Generics

+0

Оба A и B расширяют 'NSManagedObject', поэтому ваш ответ не разрешает мою проблему :( – CZ54

Смежные вопросы