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

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

數組擴展以按值刪除對象

數組擴展以按值刪除對象

明月笑刀無情 2019-07-01 09:59:00
數組擴展以按值刪除對象extension Array {     func removeObject<T where T : Equatable>(object: T) {         var index = find(self, object)         self.removeAtIndex(index)     }}但是,我在var index = find(self, object)不可轉換為“T”我還嘗試使用此方法簽名:func removeObject(object: AnyObject)然而,我也得到了同樣的錯誤:‘AnyObject’不可轉換為‘T’做這件事的正確方法是什么?
查看完整描述

3 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

截至SWIFT 2,這可以通過協議擴展方法removeObject()的所有類型上定義為一個方法。RangeReplaceableCollectionType(特別是在Array)如果集合的元素是Equatable:

extension RangeReplaceableCollectionType where Generator.Element : Equatable {

    // Remove first collection element that is equal to the given `object`:    mutating func removeObject(object : Generator.Element) {
        if let index = self.indexOf(object) {
            self.removeAtIndex(index)
        }
    }}

例子:

var ar = [1, 2, 3, 2]ar.removeObject(2)print(ar) // [1, 3, 2]

更新為SWIFT 2/Xcode 7 beta 2:正如空速度在注釋中所注意到的,現在實際上可以在對模板有更多限制的泛型類型上編寫一個方法,因此該方法現在實際上可以定義為Array:

extension Array where Element : Equatable {

    // ... same method as above ...}

協議擴展仍然具有適用于較大類型集的優點。

更新為SWIFT 3:

extension Array where Element: Equatable {

    // Remove first collection element that is equal to the given `object`:    mutating func remove(object: Element) {
        if let index = index(of: object) {
            remove(at: index)
        }
    }}


查看完整回答
反對 回復 2019-07-01
?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

不能在對模板有更多限制的泛型類型上編寫方法。

:從SWIFT2.0開始,您現在可以編寫以下方法對模板有更嚴格的限制。如果您已經將代碼升級到2.0,請參閱其他答案,以獲得使用擴展實現此功能的新選項。

你得到錯誤的原因'T' is not convertible to 'T'實際上是在定義新的方法中的T與原始T完全無關,如果您想在您的方法中使用T,您可以這樣做,而無需在您的方法上指定它。

第二個錯誤的原因'AnyObject' is not convertible to 'T'T的所有可能值并不都是類。對于要轉換為AnyObject的實例,它必須是類(不能是struct、enum等)。

最好的方法是使它成為接受數組作為參數的函數:

func removeObject<T : Equatable>(object: T, inout fromArray array: [T]) {}

或者,您可以通過返回一個副本來使您的方法更安全和更可重用,而不是修改原始數組:

func arrayRemovingObject<T : Equatable>(object: T, fromArray array: [T]) -> [T] {}

作為我不推薦的另一種選擇,如果存儲在數組中的類型不能轉換為方法模板(這是可等價物),則可以讓方法以靜默方式失敗。(為了清晰起見,我使用的是U而不是T作為方法的模板):

extension Array {
    mutating func removeObject<U: Equatable>(object: U) {
        var index: Int?
        for (idx, objectToCompare) in enumerate(self) {
            if let to = objectToCompare as? U {
                if object == to {
                    index = idx                }
            }
        }

        if(index != nil) {
            self.removeAtIndex(index!)
        }
    }}var list = [1,2,3]list.removeObject(2) // Successfully removes 2 because types matchedlist.removeObject("3") // fails silently to remove anything because the types don't matchlist // [1, 3]

編輯為了克服沉默的失敗,你可以把成功當作一個噓聲:

extension Array {
  mutating func removeObject<U: Equatable>(object: U) -> Bool {
    for (idx, objectToCompare) in self.enumerate() {  //in old swift use enumerate(self) 
      if let to = objectToCompare as? U {
        if object == to {
          self.removeAtIndex(idx)
          return true
        }
      }
    }
    return false
  }}var list = [1,2,3,2]list.removeObject(2)list
list.removeObject(2)list


查看完整回答
反對 回復 2019-07-01
?
Smart貓小萌

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

簡明扼要:

func removeObject<T : Equatable>(object: T, inout fromArray array: [T]) {
    var index = find(array, object)
    array.removeAtIndex(index!)}


查看完整回答
反對 回復 2019-07-01
  • 3 回答
  • 0 關注
  • 594 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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