2016-04-25 30 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

似乎在课堂上实现将是一个更好的方法。这是一个令人头疼的快速语法 –