2016-11-06 2 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

Foo не соответствует 'Equatable'. Он нуждается в определении для '==' – Alexander

+0

Извините, но у меня есть это, но я просто указал havent в примере. –

ответ

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 потребности быть Element из массива, который может быть любой подкласс Foo.

И, к сожалению, Swift не может вывести тип Element с ограничениями на Iterator.Element. Возможно, вам придется объявить ограничение Element напрямую.

(И проверить код выше, я удалил : Equatable от вашего Foo, что не имеет значения, когда вы используете index(where:) в расширении.)

+0

Спасибо! Я думал, что тестировал это, но, видимо, я не знаю ... –

+0

Существует множество комбинаций - ограничение расширения, тип объекта, с помощью 'index (where:)' или 'index (of:)' ... My ответ - всего лишь пример, и может быть другая комбинация, которая подходит для вашей цели. Пожалуйста, найдите его самостоятельно. – OOPer

Смежные вопросы