如何转换可选类型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)
}