亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在Swift中擴展類型化數組?

如何在Swift中擴展類型化數組?

iOS
斯蒂芬大帝 2019-12-10 13:08:03
如何使用自定義功能實用程序擴展Swift Array<T>或T[]類型?瀏覽Swift的API文檔可發現Array方法是的擴展T[],例如:extension T[] : ArrayType {    //...    init()    var count: Int { get }    var capacity: Int { get }    var isEmpty: Bool { get }    func copy() -> T[]}當復制和粘貼相同的源并嘗試任何變體時,例如:extension T[] : ArrayType {    func foo(){}}extension T[] {    func foo(){}}它無法生成并顯示以下錯誤:標稱類型T[]不能擴展使用完整類型定義失敗Use of undefined type 'T',即:extension Array<T> {    func foo(){}}并且也無法使用Array<T : Any>和Array<String>。奇怪的是,Swift讓我擴展了一個無類型數組:extension Array {    func each(fn: (Any) -> ()) {        for i in self {            fn(i)        }    }}它讓我打電話給:[1,2,3].each(println)但是我無法創建適當的泛型類型擴展,因為當類型流過該方法時,該類型似乎丟失了,例如,嘗試用以下方法替換Swift的內置過濾器:extension Array {    func find<T>(fn: (T) -> Bool) -> T[] {        var to = T[]()        for x in self {            let t = x as T            if fn(t) {                to += t            }        }        return to    }}但是編譯器將其視為無類型的,但仍允許使用以下命令調用擴展名:["A","B","C"].find { $0 > "A" }當使用調試器進行步進指示類型Swift.String為時,嘗試像字符串一樣訪問它而不先轉換為它是一個構建錯誤String,即:["A","B","C"].find { ($0 as String).compare("A") > 0 }有誰知道創建像內置擴展一樣的類型化擴展方法的正確方法是什么?
查看完整描述

3 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

對于使用類擴展類型化數組,以下內容對我有用(Swift 2.2)。例如,對類型化數組進行排序:


class HighScoreEntry {

    let score:Int

}


extension Array where Element:HighScoreEntry {

    func sort() -> [HighScoreEntry] {

      return sort { $0.score < $1.score }

    }

}

試圖做到這一點與結構或typealias會給出錯誤:


Type 'Element' constrained to a non-protocol type 'HighScoreEntry'

更新:


要使用非類擴展類型化數組,請使用以下方法:


typealias HighScoreEntry = (Int)


extension SequenceType where Generator.Element == HighScoreEntry {

    func sort() -> [HighScoreEntry] {

      return sort { $0 < $1 }

    }

}

在Swift 3中,某些類型已重命名:


extension Sequence where Iterator.Element == HighScoreEntry 

{

    // ...

}



查看完整回答
反對 回復 2019-12-11
?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

嘗試了一段時間之后,解決方案似乎<T>從簽名中刪除了,例如:


extension Array {

    func find(fn: (T) -> Bool) -> [T] {

        var to = [T]()

        for x in self {

            let t = x as T;

            if fn(t) {

                to += t

            }

        }

        return to

    }

}

現在可以按預期運行,而不會出現構建錯誤:


["A","B","C"].find { $0.compare("A") > 0 }



查看完整回答
反對 回復 2019-12-11
?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

擴展所有類型:


extension Array where Element: Comparable {

    // ...

}

擴展一些類型:


extension Array where Element: Comparable & Hashable {

    // ...

}

擴展特定類型:


extension Array where Element == Int {

    // ...

}



查看完整回答
反對 回復 2019-12-11
  • 3 回答
  • 0 關注
  • 521 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號