2016-04-25 28 views
2

我是新來的Swift,我想爲db訪問創建一個抽象工廠。 這裏是我的協議如何在結構中實現此協議

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 
{ 

} 

如何實現結構AccountDAORealm在結構RealmFactory的IDAOFactory和IAccountDAO? 任何人都可以幫忙嗎?

+0

爲什麼結構?結構是值對象,而不是引用對象。 – gnasher729

+0

你的意思是使用Class會更好嗎? –

+0

這是您的決定,但結構以_values_的形式傳遞,因此每個調用您的工廠的人都會得到不同的結構。每次將結構傳遞給函數時,都會創建一個結構體的副本。 – gnasher729

回答

1

Swift中的泛型有很多限制,特別是在協議中使用和在struct中實現時。讓我們等到斯威夫特3 :)

我使用協議和派生類或類仿製藥,但混合協議泛型和結構使得頭痛斯威夫特2(C#泛型在方便多了)

我與您的代碼打在操場上,這裏是

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

似乎在課堂上實現將是一個更好的方法。這是一個令人頭疼的快速語法 –