How to bind to property of property of binding in swiftui?

I have a SwiftData object called Asset. Asset has an optional relationship to another SwiftData object called Income. Income has an Int? called cashflow.

AssetsListView shows a list of assets and has a + button to create an asset object and show the AddEditAssetView where the user can fill in the values on the asset.

The newly added asset is a @State variable in AssetsListView.

That asset is a @Binding in AddEditAssetView.

In AddEditAssetView, I use a custom view called MoneyTextField which is just a simple wrapper around a standard TextField but it does some customized formatting and such.

One of these MoneyTextFields that I'm showing is so the user can edit the cashflow amount which is found in $asset.income.cashflow.

MoneyTextField("placeholder text", value: $asset.income.cashflow)
// inside MoneyTextField, value is: @Binding var value: Int?

But since all relationships in SwiftData need to be optional, $asset.income is a Income? and so I get the understandable error:

Value of optional type 'Income?' must be unwrapped to refer to member 'cashflow' of wrapped base type 'Income'

But if I change it to:

MoneyTextField("placeholder text", value: $asset.income?.cashflow)

I get the error:

Cannot use optional chaining on non-optional value of type 'Binding<Income?>'

When $asset is my @Binding, how do I pass $mybinding.property.otherproperty as a binding to a subview?

I'm a long time ObjC app dev, new-ish to swift and brand new to swiftui, so I'm kind of lost. Is there a simple way to do what I'm doing or is my entire approach wrong because I'm not thinking in a proper swiftui mind yet?


More code for context:

struct AssetsView: View {
@State var addedasset: Asset?
// more stuff
var body: some View {
NavigationStack {
List {
MoreStuff()
}
.toolbar {
ToolbarItem {
Button {
let asset = Asset(name: "", assetType: .realestate)
self.addedasset = asset
self.modelContext.insert(asset)
} label: {
Image(systemName: "plus")
}
.fullScreenCover(isPresented: $showingaddscreen) {
AddEditAssetView(player: $player, asset: $addedasset)
}
}
}
}
}
}
struct AddEditAssetView: View {
@Binding var asset: Asset
var body: some View {
NavigationStack {
Form {
OtherStuff()
// here's where the compile error is
MoneyTextField(localizedstringkey: "realestate_cashflow_eg", value: $asset.income?.cashflow)
}
}
}
}
struct MoneyTextField: View {
var localizedstringkey: LocalizedStringKey
@Binding var value: Int?
@State var valuestring = ""
var body: some View {
TextField(localizedstringkey, text: $valuestring)
.textFieldStyle(.roundedBorder)
.keyboardType(.numberPad)
.onReceive(Just(valuestring), perform: { foo in
print("onReceive: foo | \(String(describing: foo))")
updatevalueint(valstring: foo)
})
.onAppear {
if let intval = self.value {
updatevaluestring(val: intval)
}
}
}
}
How to bind to property of property of binding in swiftui?
 
 
Q