Привести коллекцию в соответствие с пользовательским протоколом - PullRequest
0 голосов
/ 26 октября 2018

Я хочу добавить универсальный параметр для всех типов коллекций, которые имеют isEmpty, чтобы они также могли иметь isNotEmpty Когда я пытаюсь заставить Collection соответствовать Occupiable Я получил ошибку компиляции

ошибка здесь: расширение протокола 'Collection' не может иметь предложение о наследовании

также String соответствует протоколу, который присущ массиву, поэтому мы можем просто удалить extension String: Occupiable { }, как только мы нашлирешение проблемы выше?

// Anything that can hold a value (strings, arrays, etc)
protocol Occupiable {
    var isEmpty: Bool { get }
    var isNotEmpty: Bool { get }
}

// Give a default implementation of isNotEmpty, so conformance only requires one implementation
extension Occupiable {
    var isNotEmpty: Bool {
        return !isEmpty
    }
}

extension String: Occupiable { }

//  error here : Extension of protocol 'Collection' 
//  cannot have an inheritance clause
extension Collection: Occupiable { }

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Вам необходимо установить ограничение на соответствие. Это исправит ошибку.

extension Collection where Self: Occupiable { }
0 голосов
/ 26 октября 2018

Здесь вы создали протокол Occupiable с переменными isEmpty и isNotEmpty, поэтому, когда мы реализуем протокол в любом классе, эти две переменные необходимо объявить для протокола fullfill.но здесь вы уже объявляете переменную isNotEmpty внутри расширения Occupiable, так что теперь только один isEmpty обязателен в классе, где мы реализуем протокол.То же самое относится к протоколу сбора данных, поэтому нам нужно расширить протокол.но это работает в строке, потому что строка является структурой.
вам нужно код для коллекции, как:

extension Collection where Self : Occupiable {}
...