Swift 比較運算符

動機

Swift 升級至 3.0 以后,Swift 標準庫中移除了對可選類型比較運算符的實現,當我們升級 Swift 版本的時候,可能會出現若干問題,為了代碼重構需要,所以重寫比較運算符。

代碼變更記錄

Swift2.3 時代的代碼如下

if (self?.monthParams.filter{ return $0.length == 0 })?.count > 0 {
    self?.showTip("請輸入日期")
}

升級到 Swift3.0 以后,需要這樣寫

if ((self?.monthParams.filter{ return $0.length == 0 })?.count ?? 0) > 0 {
    self?.showTip("請輸入日期")
}
  • Tips

    • 這里的 > 左右兩邊的操作數,必須是非可選類型!所以會出現大量的類似于?? 0這樣的代碼!
    • 只修改一處無關緊要,一旦涉及到整個項目,可想而知有多么的蛋疼……
  • 分析

    • 出現這個問題的根本原因是 Swift3.0 后,運算符兩邊的操作數必須是非可選類型
    • 我們可以重寫比較運算符,讓它接受可選類型的操作數,這樣代碼就不需要修改了!

☆ 重寫運算符

public func > <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
    switch (lhs, rhs) {
    case let (l?, r?):
        return l > r
    case (nil, _):
        return false
    case (_, nil):
        return true
    default:
        return false
    }
}
public func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
    return rhs > lhs
}
public func >= <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
    return lhs > rhs || lhs == rhs
}
public func <= <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
    return rhs >= lhs
}

這樣就可以愉快地玩耍了,哈哈哈!

附錄

Swift 標準庫中的部分比較運算符

public func <(lhs: Int, rhs: Int) -> Bool
public func <=(lhs: Int, rhs: Int) -> Bool
public func >(lhs: Int, rhs: Int) -> Bool
public func >=(lhs: Int, rhs: Int) -> Bool

public func ==<T>(lhs: T?, rhs: T?) -> Bool where T : Equatable
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容