2016-11-06 55 views
0

我試圖創建一個擴展,但不知它口口聲聲說:變異擴展陣列

曖昧參考成員「==」。

class Foo: Equatable { 
    var string = "" 
    var number = 0 

    init(string: String, number: Int) { 
     self.string = string 
     self.number = number 
    } 
} 

extension Array where Iterator.Element: Foo { 

    mutating func replace(object: Foo) { 
     if let index = index(where: { $0.number == object.number}) { 
      self[index] = object 
     } 
    } 
} 

func ==(lhs: Foo, rhs: Foo) -> Bool { 
    return lhs.number == rhs.number 
} 

我在做什麼錯?

+0

符不符合'Equatable'(並測試上面的代碼,我從你的Foo,當你在擴展使用index(where:)這是無關緊要的。除去: Equatable)。它需要'=='的定義 – Alexander

+0

對不起,我確實擁有它,但我只是沒有在示例中顯示。 –

回答

1

試試這個:

extension Array where Element: Foo { 

    mutating func replace(object: Element) { 
     if let index = index(where: {$0.number == object.number}) { 
      self[index] = object 
     } 
    } 

} 

爲了self[index] = object有效,object需要在陣列,它可以是任何Foo子類的Element

不幸的是,斯威夫特不能推斷Element從約束到Iterator.Element的類型。您可能需要直接聲明限制爲Element

+0

謝謝!我認爲我測試了這一個,但顯然我沒有... –

+0

有很多組合 - 擴展約束,'對象'類型,使用'index(where:)'或'index(of:)'... My答案只是一個例子,可能會有另一種適合您的目的的組合。請自己找一個。 – OOPer