用 swift 解決以下示例的合適方法是什么?
我知道由于型別擦除,您無法StructB在item2建構式中分配。在像JavaT這樣的其他語言中,我會通過在結構中沒有泛型類引數來解決問題,Container但讓 varsitem和item2只是ProtocolA(like var item2: ProtocolA) 的型別。swift 不允許這樣做:協議“ProtocolA”只能用作通用約束,因為它具有 Self 或關聯的型別要求
我完成了關于泛型的 swifts 檔案的這一部分,但到目前為止,我無法針對我的簡單問題調整解決方案:
protocol ProtocolA {
associatedtype B
func foo() -> B
}
struct StructA: ProtocolA {
typealias B = String
func foo() -> String {
"Hello"
}
}
struct StructB: ProtocolA {
typealias B = Double
func foo() -> Double {
0.0
}
}
struct Container<T: ProtocolA> {
var item: T
var item2: T
init(item: T) {
self.item = item
self.item2 = StructB() // err: Cannot assign value of type 'StructB' to type 'T'
}
}
I also want to know how a solution could look if I do not want to specify a generic type parameter at all for the container struct. So that I could write the following:
func test() {
let container = Container(StructA()) // no type given
}
uj5u.com熱心網友回復:
對于所描述的問題,答案非常簡單:
struct Container<T: ProtocolA> {
var item: T
var item2: StructB // This isn't T; you hard-coded it to StructB in init
init(item: T) {
self.item = item
self.item2 = StructB()
}
}
let container = Container(item: StructA()) // works as described
我覺得這個問題有一些更深層次的東西,這就是亞歷山大要求更多背景資訊的原因。如所寫,問題的答案似乎太簡單了,所以我們中的一些人認為還有更多您沒有解釋的內容,我們希望避免一輪“這是答案”,然后是“我不是這個意思”。
在您撰寫它時,您嘗試強制item并item2具有相同的型別。這顯然不是你的意思,因為T它是由呼叫者給出的,并且item2總是 StructB (它不必等于T,正如錯誤所解釋的那樣)。
您打算以另一種方式呼叫此代碼嗎?目前還不清楚呼叫的代碼是什么foo()樣的。您是否有其他方式來初始化您未在問題中解釋的 Container?
也許您想要兩種不同的型別,而您只希望 StructB 成為默認值?在這種情況下,它看起來像(基于 Ptit Xav 的回答):
struct Container<T: ProtocolA, U: ProtocolA> {
var item: T
var item2: U
// Regular init where the caller decides T and U
init(item: T, item2: U) {
self.item = item
self.item2 = item2
}
// Convenience where the caller just decides T and U is default
init(item: T) where U == StructB {
self.init(item: item, item2: StructB())
}
}
where U == StructB允許您為 U 創建默認型別。
uj5u.com熱心網友回復:
做你想做的事情的唯一方法是:
struct Container<T: ProtocolA,U: ProtocolA> {
var item: T
var item2: U
init(item: T, item2: U) {
self.item = item
self.item2 = item2
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/427850.html
上一篇:TS2322:型別'(new()=>typeofRectangle)[]'不可分配給型別'Rectangle[]'
下一篇:通用回傳型別
