Вопрос:

Мутирующее расширение для массива

arrays swift

505 просмотра

2 ответа

1440 Репутация автора

Я пытаюсь создать расширение, но почему-то оно продолжает говорить:

Неоднозначная ссылка на члена '=='.

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
}

Что я делаю неправильно?

Автор: Henny Lee Источник Размещён: 06.11.2016 05:58

Ответы (2)


2 плюса

37724 Репутация автора

Решение

Попробуй это:

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:)в расширении.)

Автор: OOPer Размещён: 06.11.2016 06:31

0 плюса

138 Репутация автора

Версия Swift 5 и поддержка замены нескольких объектов (добавить, если не существует).

extension Foo {
    public static func == (lhs: Object, rhs: Object) -> Bool {
        return lhs.id == rhs.id
    }
}

extension Array where Element: Foo {
    mutating func replace(object: Element) -> Bool {
        if let index = firstIndex(where: {$0 == object}) {
            self[index] = object
            return true
        }
        return false
    }

    mutating func replace(objects: Array<Element>) {
        objects.forEach { (object) in
            if replace(object: object) == false {
                self.append(object)
            }
        }
    }
}
Автор: Li Jin Размещён: 11.08.2019 07:47
Вопросы из категории :
32x32