我有一个这样的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)
}