簡(jiǎn)潔使用Swift實(shí)例(isIn)

前提

大家應(yīng)該常遇到在table view的delegate里處理若干個(gè)cell的問題.很多人的條件語(yǔ)句是這樣的:

if indexPath.row == 0 || indexPath.row == 1 || indexPath.row == 3 {
    // do something
}

這個(gè)寫法非常常規(guī),也清晰明了.但是致命的缺點(diǎn)是

  • 當(dāng)我有更多選項(xiàng)時(shí)長(zhǎng)度已經(jīng)超出字符限制
  • 沒有辦法實(shí)現(xiàn)可變數(shù)量的選項(xiàng)

解決方案

簡(jiǎn)單處理下,可以將所有可能放到數(shù)組或者范圍(如果連續(xù))中.然后調(diào)用其contains方法用于校驗(yàn).代碼如下:

if (2...8).contains(indexPath.row) {
    // do something
}
if [2,4,6,9].contains(indexPath.row) {
    // do something
}
if 2...8 ~= indexPath.row {                // 匹配運(yùn)算符
    // do something
}

優(yōu)化

這樣雖然解決了前提所述的兩個(gè)問題,但是寫法不夠美觀,語(yǔ)義不夠清晰.如果說可以使用isIn(:)函數(shù)處理,就顯得美觀多了.實(shí)現(xiàn)如下:

// 定義
extension Int {
    func isIn(range: Range<Int>) -> Bool {
        return range.contains(self)
    }
    
    func isIn<T: SequenceType where T.Generator.Element == Int>(ints: T) -> Bool {
        return ints.contains(self)
    }
    
    func isIn(ints: Int...) -> Bool {   //這里使用可變參數(shù)函數(shù)來避免必須將參數(shù)放入數(shù)組
        return ints.contains(self)
    }
}
// 使用
if indexPath.row.isIn(4,5,6) {
    // do something
}

這樣實(shí)現(xiàn)了美觀簡(jiǎn)潔地使用,但是還不夠通用.比如UInt,Float等可以支持Range或數(shù)組的類型卻無(wú)法使用.如果要更加通用,必須研究下contains函數(shù),其定義如下:

extension SequenceType where Generator.Element : Equatable {
    /// Returns `true` iff `element` is in `self`.
    @warn_unused_result
    public func contains(element: Self.Generator.Element) -> Bool
}

那么顯然我們需要擴(kuò)寫Equatable協(xié)議,讓其實(shí)現(xiàn)isIn(:)函數(shù).代碼如下:

extension Equatable {
    func isIn<T: SequenceType where T.Generator.Element == Self>(collection: T) -> Bool {
        return collection.contains(self)
    }
    
    func isIn(collection: Self...) -> Bool {
        return collection.contains(self)
    }
}

這里需要說明下Range不需額外定義的理由.首先Range的定義如下:

public struct Range<Element : ForwardIndexType> : Equatable, CollectionType, CustomStringConvertible, CustomDebugStringConvertible {...}

它遵循于CollectionType(繼承自SequenceType),它的Element遵循于ForwardIndexType(繼承自Equatable),所以它是符合extension Equatable中第一個(gè)函數(shù)的.

后記

至此,我們用最簡(jiǎn)潔的方式寫出了contains的反函數(shù).這一切要感謝Swift強(qiáng)大的特性支持我們?cè)诓煌S度約束條件,既安全又強(qiáng)大.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容