gpt4 book ai didi

ios - 应用于绑定(bind)时在 SwiftUI 中展开可选的@State

转载 作者:行者123 更新时间:2023-12-05 05:35:34 25 4
gpt4 key购买 nike

我正在寻找一个干净的解决方案来解决这个 SwiftUI 挑战。

以下代码可以编译但无法运行,因为 @State 属性在 ContentView 范围之外。

import SwiftUI

struct ContentView: View {
var state: LocalState?

var body: some View {
if let state = state {
Toggle("Toggle", isOn: state.$isOn)
}
}
}

extension ContentView {
struct LocalState {
@State var isOn: Bool
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
VStack {
ContentView(
state: .init(isOn: false)
)
.border(Color.red)

ContentView()
.border(Color.red)
}

}
}

由于以下原因,以下代码无法编译:

Value of optional type 'ContentView.LocalState?' must be unwrapped to refer to member 'isOn' of wrapped base type 'ContentView.LocalState'

似乎 $state.isOn 中的 $ 指的是原始 state 而不是 unwrapped一个。

import SwiftUI

struct ContentView: View {
@State var state: LocalState!

var body: some View {
if let state = state {
Toggle("Toggle", isOn: $state.isOn)
}
}
}

extension ContentView {
struct LocalState {
var isOn: Bool
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
VStack {
ContentView(
state: .init(isOn: false)
)
.border(Color.red)

ContentView()
.border(Color.red)
}
}
}

我不想要的是:

  • 在 ContentView 中使用可失败初始化器。
  • isOn 属性移到 LocalState 之外。

我怎样才能实现这些目标?

最佳答案

这对我有用:

var body: some View {
if let isOn = Binding($state)?.isOn {
Toggle("Toggle", isOn: isOn)
}
}

分解:$stateBinding<LocalState?> ,我们使用 the Binding initialiser (希望这不是您不想使用的失败初始化程序)将其转换为 Binding<LocalState>? .然后我们可以使用可选链接和 if let得到 Binding<Bool>

相关:How can I unwrap an optional value inside a binding in Swift?

关于ios - 应用于绑定(bind)时在 SwiftUI 中展开可选的@State,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73486242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com