我有一個像這樣的初始化:
@Binding var height: Double?
init(height: Binding<Double?>? = nil) {
self._height = height
}
我收到一個錯誤:
可選型別 'Binding<Double?>?' 的值 必須解包為 'Binding<Double?>' 型別的值
什么是正確的語法,這樣如果不需要,我就不需要在 init 中傳遞任何值,但是如果我確實傳遞了高度,它將分配給本地系結變數?
謝謝。
uj5u.com熱心網友回復:
將可選項“轉換”為非可選項的程序是展開。將可選項轉換為非可選項的唯一方法是在可選項為 的情況下提供一些默認值nil。
optional你對 Swift和默認引數有點困惑。
你的問題是你希望你的height引數是可選的(因為呼叫者不需要指定它),但你不應該將它宣告為,optional因為你的物件需要有一個實體Binding- 系結必須存在即使它的包裝值可能是nil.
系結中包裝的型別是可選的Double,這就是您需要提供的默認值 - 系結到Double?. 你可以這樣做Binding.constant
struct SomeView {
@Binding var height: Double?
init(height: Binding<Double?> = .constant(nil)) {
self._height = height
}
}
現在您的默認值是系結到 aDouble?并且包裝的值是nil
如果您確實希望呼叫者能夠顯式傳遞系結nil,height那么您必須處理初始化程式本身的默認值:
struct SomeView {
@Binding var height: Double?
init(height: Binding<Double?>? = nil) {
self._height = height ?? .constant(nil)
}
}
uj5u.com熱心網友回復:
永遠不需要將系結傳遞給可選項。您真正想要的是能夠處理這兩種情況:
init(height: Binding<Double>) {
_height = .init(height)
}
init() {
_height = .constant(nil)
}
通過使用默認值可以密切模擬:
init(height: Binding<Double>? = nil) {
_height = height.map(Binding.init) ?? .constant(nil)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473507.html
上一篇:使用計時器值更新標簽文本
