Я знаю, почему у меня появляется сообщение об ошибке, поэтому вопрос больше о том, что есть в Swift 2.x раз, рекомендуемый способ сделать это.
Данные, которые я хочу представить, концептуально представляют собой не что иное, как Array
специализированного класса/структуры с некоторыми дополнительными методами, которые семантически имеют смысл только для этого конкретного типа элементов.
Swift предоставляет нам ограниченные расширения, которые отлично подходят для этого.
Чтобы конкретизировать мою проблему, скажем, мне нужна колода карт. Итак, для Card
я могу определить протокол, который позволит мне сделать ограниченное расширение на Array
.
// Define a protocol for specializing Arrays of Cards
protocol _CardType {}
extension Card: _CardType {}
А потом
typealias Deck = [Card]
extension Array where Element : _CardType {
}
Внутри этого расширения я могу определить все функции, которые мне нужны, связанные с колодой карт, скажем, перетасовку, разрезание или что-то еще.
Я мог бы также внутри этого расширения написать что-то вроде
var description: String {
return "Deck: " + self.map { "\($0)" }.joinWithSeparator(",")
}
Это было бы хорошо и хорошо, пока я не попытаюсь в какой-то момент написать где-нибудь в другом месте.
func showDeck() {
print(deck.description)
}
Это даже не скомпилируется, получив сообщение
Неоднозначное использование слова «описание».
Конечно, здесь мне удалось получить версию описания Array и версию моего расширения, и на данный момент компилятор не может сказать, какая из них правильная.
Я не могу подсказать ключевое слово override
. Если бы я попытался использовать его в расширении, я бы получил сообщение
Свойство не переопределяет какое-либо свойство своего суперкласса
Простые решения в этом выдуманном сценарии заключались бы в том, чтобы определить для Deck
другую функцию prettyDescription
, чтобы не пришлось пытаться переопределить описание или использовать модель «имеет-а» вместо модели «есть-а». (т.е.) Deck
будет иметь свойство с массивом карт.
Дело в том, что я хочу воспользоваться уже существующим кодом за пределами моего класса, где уже есть функциональность, которая ожидает отношение «есть-а» (в данном случае наличие description
).
В придуманном сценарии функция description
является стандартным способом вывода Array
, поэтому я хочу, чтобы Deck
соответствовало ей.
Рад услышать мысли о наилучшем способе приблизиться к этому.