簡體   English   中英

Swift:為可選值創建一個infix運算符,該運算符為空時提供默認值

[英]Swift: create a infix operator for Optional values which provide default values when empty

關於我的最后一個問題(在這里: Swift檢查條件是否實現了屬性的條件 ),在這里我以為我很聰明,通過使用以下代碼創建協議擴展來為nil或空字符串提供默認值,我現在還有另一個問題。 但是首先,這是代碼:

protocol Emptyable {
    var isEmpty: Bool { get }
}

extension Optional where Wrapped: Emptyable {
    func orWhenNilOrEmpty<T: Emptyable>(_ defaultValue: T) -> T {
        switch(self) {
        case .none:
            return defaultValue
        case .some(let value) where value.isEmpty:
            return defaultValue
        case .some(let value):
            return value as! T
        }
    }
}

extension String: Emptyable {}

如您所見,我現在可以為實現我定義的Emptyable協議的可選提供默認值。 我這樣做是為了保存這種樣式不斷重復的代碼(更多關於為什么我在另一個問題中提到的博客文章中這樣做):

if let unwrapped = optional, !unwrapped.isEmpty {
    myLabel.text = unwrapped
} else {
    myLabel.text = "Some Default Text"
}

現在,出於學習和成為更好的開發人員的目的,我認為創建一個新的運算符來像我這樣調用orWhenNilOrEmpty函數可能會很有趣:

let optionalString: String? = nil
let actualString: String = some ??? "Hello World"

所以我嘗試了這個:

infix operator ???: DefaultPrecedence
extension Optional where Wrapped: Emptyable {
    static func ???<T>(left: T?, right: T) -> T {
        return left.orWhenNilAndEmpty(right)
    }
}

但是我得到了這個錯誤,我也不是很清楚為什么。 希望您能澄清問題並解釋我做錯了什么:

generic parameter 'Wrapped' could not be inferred

原來問題出在試圖在函數聲明中使用泛型T 同樣, DefaultPrecedence也不是最佳選擇。 這就是我現在解決它的方法及其工作方式:

protocol Emptyable { var isEmpty: Bool { get } }

infix operator ???: NilCoalescingPrecedence

extension Optional where Wrapped: Emptyable {
    func orWhenNilOrEmpty(_ defaultValue: Wrapped) -> Wrapped {
        switch(self) {
        case .none:
            return defaultValue
        case .some(let value) where value.isEmpty:
            return defaultValue
        case .some(let value):
            return value
        }
    }

    static func ???(left: Wrapped?, right: Wrapped) -> Wrapped {
        return left.orWhenNilOrEmpty(right)
    }
}

現在,我所要做的就是在需要的地方實現Emptyable ,然后可以使用??? 從任何可選的獲取非空值:

extension String: Emptyable {}
let notEmptyString = nilOrEmptyOptionalString ??? "Meaningful default value"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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