簡體   English   中英

將可選綁定轉換為非可選綁定

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM