2016-04-25 16 views
2

私はSwiftを使い慣れていません.dbアクセス用の抽象的なファクトリを作成したいと思います。ここ は私のプロトコルは、構造体AccountDAORealmに構造体RealmFactoryとIAccountDAOでIDAOFactoryを実装する方法をこのプロトコルを構造体に実装するには

protocol IDAOFactory 
{ 
    associatedtype DAO: IDAO 

    func createAccountDAO<DAO: IAccountDAO>() -> DAO 
} 

struct RealmFactory: IDAOFactory 
{ 

} 

protocol IDAO 
{ 
    associatedtype T 
    func save(object: T) 
} 

protocol IAccountDAO : IDAO 
{ 

} 

struct AccountDAORealm: IAccountDAO 
{ 

} 

のですか? 誰でも助けることができますか?

+0

なぜ構造体ですか?構造体は参照オブジェクトではなく、値オブジェクトです。 – gnasher729

+0

あなたはクラスを使用する方が良いでしょうか? –

+0

あなたの決定ですが、構造体は_values_として渡されるので、あなたのファクトリを呼び出すすべての人が異なる構造体を取得します。構造体を関数に渡すたびに、構造体のコピーが作成されます。 – gnasher729

答えて

1

スウィフトのジェネリックスは、特にプロトコルで使用され、構造体に実装されている場合、多くの制限があります。私は(はるかに便利でC#のジェネリック)プロトコルおよび派生クラスまたはクラスとジェネリックが、プロトコルのジェネリック医薬品と構造体を混合することスウィフト2に頭痛を作るを使用:)

スウィフト3まで私はあなたのコードで演奏

待ちましょうプレイグラウンドでは、こちらは

protocol IDAOFactory 
{ 
    associatedtype DAO: IDAO 

    func createAccountDAO<DAO: IAccountDAO>() -> DAO 
} 

protocol IDAO 
{ 
    init() 
    associatedtype T 
    func save(object: T) 
} 

protocol IAccountDAO : IDAO 
{ 
    init() 
} 

public class AccountDAORealm: IAccountDAO 
{ 
    var data: String = "" 

    required public init() { 
     data = "data" 
    } 

    func save(object: AccountDAORealm) { 
     //do save 
    } 
} 

let accountDAORealm = AccountDAORealm() 
//As you see accountDAORealm is constructed without any error 

struct RealmFactory: IDAOFactory 
{ 
    func createAccountDAO<AccountDAORealm>() -> AccountDAORealm { 
     return AccountDAORealm() //but here constructor gives error 
    } 
} 
+0

クラスで実装されているより良いway.itは、迅速な構文の頭痛です –

関連する問題