在swiftui中使用带有类型转换的@Binding



我的数据模型:

class MyData: ObservableObject {
@Published var aabbData = [AabbData]()
}
struct AbData: AabbData{
var x = 0
}
protocol AabbData{
}

在我的视图代码中,我想将aabbData的元素向下转换为AbData类型,并将其x属性绑定到控件的值。所以我试着编码这个:

@EnvironmentObject var data: MyData
let index = 0
//some other code
//method 1
Slider(value: ($data.aabbData[index] as! Binding<AbData>).x, in: -100...100, step: 1)
//error: Cast from 'Binding<AabbData>' to unrelated type 'Binding<AbData>' always fails
//method 2
Slider(value: Binding<Int>(
get:{
(data.aabbData[index] as! AbData).x
},
set:{
(data.aabbData[index] as! AbData).x = $0
//error: Cannot assign to immutable expression of type 'Int'
}
), in: -100...100, step: 1)

代码不起作用。如何将下转换值的属性绑定到控件的值?

Binding类型允许读取和写入。由于您不能安全地读取AabbData的值并假设它是AbData,因此这是不可行的。

如果您无论如何都想尝试,那么您必须创建一个新的Binding(可能使用Binding(get:set:)构造函数(来执行那里的强制转换。

例如,注意到这种强制铸造可能不可取,因为所有常见的原因:

let binding = Binding<AbData>(get: {
data.aabbData[index] as! AbData
}, set: {
data.aabbData[index] = $0
})

最新更新