2017-09-15 67 views
0

下面的代碼工作:我可以使用具有指定關聯類型的協議嗎?

protocol GenericStorage { 
    associatedtype Value 
    func store(value: Value) 
} 

protocol DataStorage { 
    func store(value: Data) 
} 

struct StringStorage: GenericStorage { 
    typealias Value = String 

    let wrapped: DataStorage 

    func convert(_ str: String) -> Data { 
     return Data(str.utf8) 
    } 

    func store(value: String) { 
     wrapped.store(value: convert(value)) 
    } 
} 

我可以以完全避免冗餘DataStorage協議使用GenericStorage協議與相關聯的類型的Datawrapped論點StringStorage

我希望類似如下的代碼(不工作):

protocol GenericStorage { 
    associatedtype Value 
    func store(value: Value) 
} 

struct StringStorage: GenericStorage { 
    typealias Value = String 

    let wrapped: GenericStorage where Value = Data 

    func convert(_ str: String) -> Data { 
     return Data(str.utf8) 
    } 

    func store(value: String) { 
     wrapped.store(value: convert(value)) 
    } 
} 
+0

沒有更多的上下文,它很難給你一個確切的解決方案,因爲很難判斷你想要什麼'wrapped.store(value:convert(value))'來做什麼。但是,如果您刪除typealias,'wrapped'聲明並將'store'定義爲'func store(value:String){convert(value) }',那麼您的代碼編譯完全正常。但是從你的問題來看,'StringStorage'中'store'應該做什麼並不是很清楚,我不知道這是你真正想要的。 –

+0

@DávidPásztor我想要一個類型爲'GenericStorage'的包裝器,它調用另一個'GenericStorage'上的方法,儘管'Value'的實際關聯類型可能不同。我對語言細節感興趣。 – Max

+0

爲了一般工作,您需要提供'store'函數(可能是一個通用函數)的默認實現,否則編譯器如何通過調用該類型的函數來推斷您的意思是什麼你之前沒有指定符合'GenericStorage'。 –

回答

0

根據該意見,你就需要把GenericStorage成一個通用的協議。但是,目前,你不能使協議是通用的。您只能將類型約束添加到關聯的類型(在Swift4中引入)或協議的功能。

有關通用協議的更多信息,請參見Generics Manifesto

相關問題