在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'
    }
),step: 1)

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

解决方法

Binding类型允许读取和写入。由于您无法安全地读取AabbData的值并假设它是AbData,因此无法正常工作。

如果仍然要尝试,则必须创建一个新的Binding(可能使用Binding(get:set:)构造函数)来在那里进行投射。

例如,请注意,出于所有常见原因,这种强制转换可能是不建议的:

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...