Для массива требуется, чтобы элемент "Element" соответствовал "Equatable" - PullRequest
0 голосов
/ 09 июля 2020

Я пишу приложение iOS на Swift. Я добавил класс SynchronizedArray . В методе remove я получаю сообщение об ошибке:

Ссылка на метод экземпляра 'remove (obj :)' в 'Array' требует, чтобы 'Element' соответствовал 'Equatable'

Я пробовал решения на inte rnet, но не работал.

Код:

 final class SynchronizedArray<Element> {
        var array: [Element]
        private let queue: DispatchQueue
        
    func remove(_ element:Element){
        queue.async(flags: .barrier) {
            self.array.remove(obj:element)
            //Error: Referencing instance method 'remove(obj:)' on 'Array' requires that 'Element' conform to 'Equatable'
        }
    }
    
}

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

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Просто измените декларацию class SynchronizedArray и согласуйте Element с Equatable, например,

final class SynchronizedArray<Element: Equatable> {
    //rest of the code...
}

Это решит вашу первоначальную проблему.

Появится еще одна проблема. говоря, Класс SynchronizedArray не имеет инициализаторов . Это потому, что вы не инициализировали сохраненные свойства из class. Используйте приведенный ниже код при определении свойств,

var array = [Element]()
private let queue = DispatchQueue.main //Initialize with whatever type of queue you want to use
0 голосов
/ 09 июля 2020

Ваш класс должен соответствовать Equatable, а index(of:) не рекомендуется использовать firstIndex

final class SynchronizedArray<Element:Equatable> {
    var array: [Element] = []
        private let queue: DispatchQueue? = nil
        
    func remove(_ element:Element){
        queue?.async(flags: .barrier) {
            self.array.remove(obj:element)
            //Error: Referencing instance method 'remove(obj:)' on 'Array' requires that 'Element' conform to 'Equatable'
        }
    }
    
}

fileprivate extension Array where Element: Equatable {
    
    // Remove first collection element that is equal to the given `object`:
    mutating func remove(obj: Element) {
        if let index = firstIndex(of: obj) {
            remove(at: index)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...