我有一個小例子,該行
items.append(Item(value: "A", id: index))
失敗:
型別 'Item' 沒有成員 'init'
我不明白這個問題。你能幫我嗎?
struct Model<Item> where Item: Equatable {
var items = Array<Item>()
init(){
items.append(Item(value: "A", id: index))
}
}
struct Item: Identifiable, Equatable {
static func == (lhs: Item, rhs: Item) -> Bool {
return lhs.id == rhs.id
}
var value: any Equatable
var id: Int
}
uj5u.com熱心網友回復:
發生錯誤是因為泛型型別Item與結構無關,Item編譯器將Item其視為沒有初始化程式的泛型型別。
Item當您在方法中附加具體型別時init,泛型型別毫無意義。
struct Model {
var items = Array<Item>()
init(){
items.append(Item(value: "A", id: 1))
}
}
這實際上與
struct Model {
var items = [Item(value: "A", id: 1)]
}
為了澄清這個問題,這是一個具有不同型別名稱的通用方法
struct Model<M : Equatable> {
var items = Array<M>()
init(){
items.append(Item(value: "A", id: 1))
}
}
當然這會引發編譯器錯誤
無法將型別“專案”的值轉換為預期的引數型別“M”
您可以轉換型別
items.append(Item(value: "A", id: 1) as! M)
但這使得泛型型別毫無意義——如前所述——因為 nowM等于 staticItem并且如果您嘗試指定另一種型別
let model = Model<String>()
你會得到一個運行時錯誤
無法將“__lldb_expr_1.Item”(0x104dc0118)型別的值轉換為“Swift.String”(0x1f7c94ab8)。
這會導致崩潰。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/533011.html
標籤:迅速仿制药
