swift 型别'Item'没有成员'init'

dphi5xsq  于 2022-11-21  发布在  Swift
关注(0)|答案(1)|浏览(125)

我有一个小例子

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
}
xytpbqjk

xytpbqjk1#

发生错误的原因是泛型类型Item与结构Item没有任何关系,并且编译器将Item视为没有初始值设定项的泛型类型。
当您在init方法中附加具体类型Item时,泛型类型是没有意义的。

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))
    }
}

当然,这会引发编译器错误
无法将类型'Item'的值转换为预期的参数类型'M'
您可以转换类型

items.append(Item(value: "A", id: 1) as! M)

但这使得泛型类型变得毫无意义--如上所述--因为现在M等于静态Item,如果您试图指定另一个类型

let model = Model<String>()

您将得到一个运行时错误
无法将类型“__lldb_expr_1.Item”(0x 104 dc 0118)的值强制转换为“Swift.String”(0x 1f 7 c94 ab 8)。
从而导致崩溃。

相关问题