如何转换可选类型Binding<T?>的值?到 SwiftUI 中的 Binding<T?>?
How to convert value of optional type Binding<T?>? to Binding<T?> in SwiftUI?
我有一个这样的初始化:
@Binding var height: Double?
init(height: Binding<Double?>? = nil) {
self._height = height
}
我遇到一个错误:
Value of optional type 'Binding<Double?>?' must be unwrapped to a value of type 'Binding<Double?>'
正确的语法是什么,这样我就不需要在 init 中传递任何不需要的值,但如果我确实传递了高度,它就会分配给局部绑定变量?
谢谢。
将可选项“转换”为 non-optional 的过程正在展开。将可选值转换为 non-optional 的唯一方法是在可选值是 nil
.
的情况下提供一些默认值
您对 Swift optional
与默认参数有些困惑。
你的问题是你希望你的 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)
}
我有一个这样的初始化:
@Binding var height: Double?
init(height: Binding<Double?>? = nil) {
self._height = height
}
我遇到一个错误:
Value of optional type 'Binding<Double?>?' must be unwrapped to a value of type 'Binding<Double?>'
正确的语法是什么,这样我就不需要在 init 中传递任何不需要的值,但如果我确实传递了高度,它就会分配给局部绑定变量?
谢谢。
将可选项“转换”为 non-optional 的过程正在展开。将可选值转换为 non-optional 的唯一方法是在可选值是 nil
.
您对 Swift optional
与默认参数有些困惑。
你的问题是你希望你的 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)
}