[英]Converting optional Binding to non-optional Binding
我想用一個 func 擴展綁定擴展,我們可以將可選綁定轉換為非可選綁定並將其用作普通綁定。 我幾乎可以完成它,但是 xCode 通過一個我無法處理的錯誤,我想我做的一切都是正確的。
extension Binding {
mutating func safeBinding<T>(defaultValue: T) -> Binding<T> where Value == Optional<T> {
let safeValue: T
if let unwrappedValue: T = self.wrappedValue { safeValue = unwrappedValue }
else { safeValue = defaultValue }
return Binding.init(get: { () -> T in return safeValue },
set: { (newValue) in self.wrappedValue = newValue })
}
}
錯誤:
Cannot convert return expression of type 'Binding<Optional<T>>' to return type 'Binding<T>'
extension Binding {
func safeBinding<T>(defaultValue: T) -> Binding<T> where Value == Optional<T> {
let safeValue: T
if let unwrappedValue: T = self.wrappedValue { safeValue = unwrappedValue }
else { safeValue = defaultValue }
return SwiftUI.Binding.init(get: { () -> T in return safeValue },
set: { (newValue) in self.wrappedValue = newValue })
}
}
Binding
已經有一個關聯類型Value
,因此通過嘗試使用T
,您將一個新的泛型放在已經存在的Value
之上。
但是,您最終仍將使用T
因為您希望將Value
限制為可選的場景:
extension Binding {
func safeBinding<T>(defaultValue: T) -> Binding<T> where Value == Optional<T> {
.init {
self.wrappedValue ?? defaultValue
} set: { newValue in
self.wrappedValue = newValue
}
}
}
正如評論中所指出的,如果只使用Binding.init
(注意我只使用了.init
),Xcode 編譯器會遇到困難。 這可以通過顯式使用Binding<T>.init
來解決:
extension Binding {
func safeBinding<T>(defaultValue: T) -> Binding<T> where Value == Optional<T> {
Binding<T>.init {
self.wrappedValue ?? defaultValue
} set: { newValue in
self.wrappedValue = newValue
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.