作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一个干净的解决方案来解决这个 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)
}
}
}
我不想要的是:
isOn
属性移到 LocalState
之外。我怎样才能实现这些目标?
最佳答案
这对我有用:
var body: some View {
if let isOn = Binding($state)?.isOn {
Toggle("Toggle", isOn: isOn)
}
}
分解:$state
是 Binding<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/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!