我有一个相对简单的设置,目标是在MyListView中的列表中存储不同的类型,但所有类型都符合一定的协议。
protocol HasString {
var text: String { get set }
}
struct ItemType1: HasString {
var text: String
}
struct ItemType2: HasString {
var text: String
var number: Int
}
struct MyListView: View {
var list: [any HasString]
var body: some View {
ForEach(0..<list.count, id: \.self) {
index in
Text(list[index].text)
}
}
}
struct MainView<T: HasString>: View {
let type1 = ItemType1(text: "text1")
let type2 = ItemType2(text: "text2", number: 1)
var body: some View {
let list = [type1, type2] //compile error shows here
MyListView(list: list)
}
}
我得到错误
Cannot convert value of type '[Any]' to expected argument type '[any HasString]'
2条答案
按热度按时间svmlkihl1#
原来这是一个非常小的事情。变量
list
的类型是[HasString]
,我所要做的就是在列表后面添加as [any HasString]
,错误就消失了。56lgkhnf2#
type1
和type2
是不同的结构体,它们的列表[type1, type2]
是Any,而[any HasString]
不能转换。你需要用HasString
转换它们: