在 swiftui 中使用 @Binding 和类型转换
Using @Binding with type casting in swiftui
我的数据模型:
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 = [=11=]
//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] = [=10=]
})
我的数据模型:
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 = [=11=]
//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] = [=10=]
})