SwiftUI中CDAccount.Type无法赋值给CDAccount类型报错如何解决?
错误根因
你遇到的报错是因为init里给account赋值的语句self.account = CDAccount?是错误写法:这里CDAccount?是类型本身,不是你传入的CDAccount实例,所以会触发类型不匹配的报错。
另外你的代码还有2个逻辑问题不符合需求:
- 要让上层视图可以访问
selectedStatusIndex,这个属性不能声明为@State(@State是视图内部私有状态,外部无法同步访问),需要改为@Binding @Binding类型的属性不能直接用self.属性名赋值,需要通过下划线_属性名访问其底层的Binding存储值进行初始化
修正后完整代码
struct AccountDetail: View { // 去掉不必要的隐式解包,直接绑定非可选CDAccount @Binding var account : CDAccount // 改为Binding,上层视图可同步访问该值 @Binding var selectedStatusIndex: Int // 常量数组不需要声明为@State,直接用let即可 let status = Constants.Status.status // 构造参数调整为接收两个Binding init(account: Binding<CDAccount>, selectedStatusIndex: Binding<Int>) { // 对@Binding属性初始化要加下划线访问底层存储 self._account = account self._selectedStatusIndex = selectedStatusIndex } var body: some View { Picker(selection: $selectedStatusIndex, label: Text("Status")) { ForEach(0..<status.count, id: \.self) { index in Text(status[index]) } } // 可选添加:选中值自动同步回account的statusIndex,不用手动赋值 .onChange(of: selectedStatusIndex) { newValue in account.statusIndex = Int16(newValue) } } }
上层视图调用示例
你在父视图使用时只需要传入对应的Binding即可,示例如下:
// 父视图中示例代码 struct ParentView: View { // 假设父视图持有account和选中索引的状态 @State private var selectedAccount: CDAccount @State private var currentStatusIndex: Int = 0 var body: some View { AccountDetail( account: $selectedAccount, selectedStatusIndex: $currentStatusIndex ) } }
如果不需要单独在父视图持有selectedStatusIndex,也可以直接绑定account的statusIndex属性,不需要额外声明状态变量:
AccountDetail( account: $selectedAccount, selectedStatusIndex: Binding( get: { Int(selectedAccount.statusIndex) }, set: { selectedAccount.statusIndex = Int16($0) } ) )
内容的提问来源于stack exchange,提问作者Mert Köksal
相关产品推荐
相关产品推荐

