如何在 SwiftUI 中将可选类型绑定<T?>?的值转换为绑定<T?>?



我有一个这样的init:

@Binding var height: Double?
init(height: Binding<Double?>? = nil) { 
self._height = height
}

我得到一个错误:

可选类型"Binding<Double?>?"的值'必须展开为'Binding<Double?>'类型的值

正确的语法是什么,这样我就不需要在init中传递任何值,如果它不需要,但是如果我传递了高度,它就会分配给局部绑定变量?

谢谢。

转换过程非可选选项的可选选项是展开。将可选选项转换为非可选选项的唯一方法是在可选选项为nil的情况下提供一些默认值。

你对Swiftoptional和默认参数有点困惑。

你这里的问题是你想要你的height参数是可选(在调用者不需要指定它),但你不应该声明它为optional,因为你的对象需要有一个Binding的实例-绑定必须存在,即使它的包装值可能是nil

绑定中包装的类型是一个可选的Double,这就是您需要提供的默认值—到Double?的绑定。你可以使用Binding.constant

struct SomeView {
@Binding var height: Double? 
init(height: Binding<Double?> = .constant(nil)) { 
self._height = height
}
}

现在你的默认值是一个绑定到Double?和包装值是nil

如果你确实希望调用者能够显式地为height绑定传递nil,那么你必须处理初始化器本身的默认值:

struct SomeView {
@Binding var height: Double? 
init(height: Binding<Double?>? = nil) { 
self._height = height ?? .constant(nil)
}
}

不需要将绑定传递给可选对象。您真正需要的是能够处理这两种情况:

init(height: Binding<Double>) {
_height = .init(height)
}
init() {
_height = .constant(nil)
}

与使用默认值

非常相似:
init(height: Binding<Double>? = nil) {
_height = height.map(Binding.init) ?? .constant(nil)
}

最新更新