Как расширить протокол Необязательно, где обернутый элемент - массив универсальных универсальных элементов? - PullRequest
0 голосов
/ 11 января 2019

Я бы сказал, что проблема в правильном объявлении расширения.

Я бы хотел расширить Массив, заполненный общими Элементами, где Элемент соответствует Equatable. Мне удалось сделать это:

    extension Array where Element: Equatable{
        // my code
    }

Однако я хотел бы знать, как правильно объявить расширение, когда массив, заполненный элементами Equatable, находится внутри Optional? Я знаю, что в этом случае я на самом деле расширяю протокол Optional, но я не могу понять остальное

Я думал что-то вроде:

    extension Optional where Wrapped: Array  & Equatable {
      // my code
    }

Не могу понять это. Есть идеи ?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Кристик предоставил хорошее решение. Альтернативой является написание расширения для необязательной коллекции экватизируемых элементов:

extension Optional where Wrapped: Collection, Wrapped.Element: Equatable {
    func foo() { }
}

Это применимо к массивам, фрагментам массивов и другим коллекциям.

В зависимости от того, что делает расширение, вы можете использовать комбинацию Collection, MutableCollection, BidirectionalCollection, RandomAccessCollection.

0 голосов
/ 11 января 2019

Я не думаю, что вы не можете указать это ограничение на уровне расширения, однако вы должны иметь возможность указать его на уровне функции:

extension Optional {
    func myFunc<T: Equatable>() where Wrapped == [T] {
        // do your thing
    }
}
...