2016-04-25 11 views
2

Ich bin neu in Swift und ich möchte eine abstrakte Fabrik für DB-Zugriff erstellen. Hier ist mein ProtokollWie implementiere ich dieses Protokoll in der Struktur

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 
{ 

} 

Wie die IDAOFactory in struct RealmFactory und IAccountDAO in struct AccountDAORealm implementieren? Kann jemand helfen?

+0

Warum eine Struktur? Strukturen sind Wertobjekte, keine Referenzobjekte. – gnasher729

+0

Sie meinen, mit der Klasse wird besser sein? –

+0

Es ist Ihre Entscheidung, aber Strukturen werden als _values_ übergeben, damit jeder, der Ihre Factory aufruft, eine andere Struktur erhält. Jedes Mal, wenn Sie eine Struktur an eine Funktion übergeben, wird eine Kopie der Struktur erstellt. – gnasher729

Antwort

1

Generics in Swift haben viele Einschränkungen, besonders wenn sie in Protokollen verwendet und in struct implementiert sind. Lassen Sie sich warten, bis Swift 3 :)

I-Protokolle verwenden und abgeleitete Klassen oder Generika mit Klassen, sondern macht Mischprotokolle Generika und structs Kopfschmerzen in Swift 2 (C# Generika in vielen bequemen)

ich mit Ihrem Code gespielt in Spielplatz, hier ist es

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

scheint implementieren in der Klasse wird ein besserer Weg sein. Es ist ein Kopfschmerz für schnelle Syntax –