2017-06-02 129 views
0

相關類型的協議我有下列內容之一的框架ProviderFramework:問題與斯威夫特

public class Provider { 

    public func fun(some: Model) { 

    } 

} 

public class Model { 

    public let id: Int 

    init(id: Int) { 
     self.id = id 
    } 

} 

,並具有下列內容的另一UserFramework:

public protocol ProviderProtocol { 

    func fun(some: ModelProtocol) 

} 

public protocol ModelProtocol { 

    var id: Int {get} 

} 

我要的是使Provider類符合ProviderProtocol類。所以在一個框架,進口兩個前面提到的框架我有這個:

extension ProviderFramework.Model: UserFramework.ModelProtocol {} 
extension ProviderFramework.Provider: UserFramework.ProviderProtocol {} 

不幸的是,這導致第二個一致性的錯誤。 所以,我嘗試使用相關的類型和我PROVIDERPROTOCOL變成了這樣:

public protocol ProviderProtocol { 

    associatedtype T: ModelProtocol 

    func fun(some: T) 

} 

和問題符合本:

extension ProviderFramework.Provider: UserFramework.ProviderProtocol { 
    public typealias T = ProviderFramework.Model 
} 

現在沒有任何編譯錯誤,但是如果我想使用該協議作爲一種類型是這樣的:

class Consumer { 

    var provider: ProviderProtocol? 

} 

我再次得到一個錯誤:「協議‘PROVIDERPROTOCOL’只能作爲一種通用的約束,因爲它具有自我或ssociated型需求

我希望能夠做的最後一件事。我的代碼中是否存在一些錯誤,或者如果沒有,是否存在針對此問題的其他解決方案?

非常感謝。

回答

0

按照第二種方法,爲什麼不使用提供者,而不是PROVIDERPROTOCOL?既然你在Provider類的擴展證實typealias TProviderFramework.Model

class Consumer { 
    var provider: Provider? 
} 
+0

此: 擴展提供者:PROVIDERPROTOCOL { 公共FUNC樂趣(一些:ModelProtocol){} } 增加了一個功能,提供者類,這是不是我的觀點。我想獲得 公共FUNC樂趣(部分:模型) 功能以某種方式使Provider類符合PROVIDERPROTOCOL使原來的方法調用的樂趣功能時被調用。 –

+0

爲什麼不直接改變類供應商?聽起來像Provider類被鎖定,無法更改它?所以你想使用擴展來覆蓋原來的行爲? –

+0

如果我將Provider類更改爲符合ProviderProtocol,則必須在ProviderFramework中導入UserFramework,以創建它們之間不相關的依賴關係。我想在導入它們的框架之外的第三個類中解析依賴項。 –