Swift3.0泛型的使用

Swift 有泛型,但是這次是為了引進(jìn)新的特性,就像遞歸協(xié)議約束(使得受限的擴(kuò)展遵循新協(xié)議的能力),比如遵循 Equatable的數(shù)組的元素也是遵循 Equatable的。先看個(gè)簡(jiǎn)單的??

func makeArray<Item>(repeating item:  Item , numberOfTimes: Int  ) -> [Item] {
    var result = [Item]()
    for _ in 0..<numberOfTimes {
        result.append(item)
    }
    return result
}
makeArray(repeating: "knock", numberOfTimes:4)

運(yùn)行結(jié)果:["knock","knock","knock","knock"]
因?yàn)榉盒偷木壒?,使得makeArray函數(shù)可以支持很多數(shù)據(jù)類型

升級(jí)版,加入我們需要判斷兩個(gè)數(shù)組中是否有相同的元素,使用泛型應(yīng)該如何寫呢?首先應(yīng)該要思考的問題如下:

  • 首先,既然需要判斷兩個(gè)元素相等,那么數(shù)組內(nèi)的數(shù)據(jù)類型必須實(shí)現(xiàn)Equatable協(xié)議
  • 其次,兩個(gè)數(shù)組內(nèi)元素的數(shù)據(jù)類型必須一致,否則沒有繼續(xù)下去的必要
  • 最后,因?yàn)槭褂玫氖欠盒?,那未必是?shù)組(上面說數(shù)組是為了便于表達(dá)_),但有一點(diǎn)是可以肯定的就是可以Iterator,否則無(wú)法取得其元素類型

第一步###

先按照最簡(jiǎn)單的思維,定義函數(shù):

func hasSameElement<A:Sequence,B:Sequence>(first a:A,another b:B){}

第二步###

既然是檢測(cè)有沒有相同測(cè)值,那可定需要將檢測(cè)結(jié)果返回,于是修改如下:

func hasSameElement<A:Sequence,B:Sequence>(first a:A,another b:B) -> Bool{
    return false
}

第三步###

增加條件約束:1:實(shí)現(xiàn)了Equatable,且比較的元素類型相同:

func hasSameElement<A:Sequence,B:Sequence>(first a:A,another b:B) -> Bool where A.Iterator.Element:Equatable,A.Iterator.Element == B.Iterator.Element{
    return false
}

最后###

實(shí)現(xiàn)函數(shù)邏輯,即比較元素相等:

func hasSameElement<A:Sequence,B:Sequence>(first a:A,another b:B) -> Bool where A.Iterator.Element:Equatable,A.Iterator.Element == B.Iterator.Element{
    for a_e in a{
        for b_e in b{
            if a_e == b_e{
                return true
            }
        }
    }
    return false
}
最后編輯于
?著作權(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)容