2016-05-18 15 views
0

私はクラスの拡張でジェネリック関数を作成しようとしているが、私はコンパイラエラーを取得します。スウィフト総称関数

私も、クラスAとBを持って、両方のNSManagedObject

を延長し、私は私のクラスの拡張でfindOne()関数を作成します。

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

私の問題がある:私はAでこの方法を使用する場合、戻り値の型はNSManagedObjectので

let aObject = A.findOne //type is NSManagedObject 

で、明らかに私はそれをキャストし、Aクラスのオブジェクトに

let aObject = A.findOne as! A//type is NSManagedObject 
を得ることができますここで開始

は、私は私が持って作り、ジェネリックを使用するために私の拡張機能の実装を置き換えたい:

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

オブジェクトにキャストするジェネリック型パラメータを使用します。 [私はNSManagedObjectスウィフト拡張の管理対象オブジェクトのサブクラスのインスタンスを作成するにはどうすればよい?]比較 – luk2302

+0

(http://stackoverflow.com/questions/27109268/how-can-i-create-instances-of-managed-object-subclasses- in-a-nsmanagedobject-swi)を使用します。 –

+0

@Alessandro:なぜあなたはタイトルとタグに「OS X」を追加しましたか?私はちょうどのみタグに追加したい、iOSとOSXの両方でコアデータが同様にiOSの上に存在し、この問題の何もOS Xの –

答えて

0

あなたはすべてのモデルが継承BaseModelを作成することができます。あなたは戻り値の型として `Self`を使用する場合があります応じて

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

関連する問題