У меня есть пользовательский тип Banana
, и я хотел бы создать расширение Array
(или, если я должен, Sequence
) из Banana
в соответствии с протоколом CustomStringConvertible
так, что вызов description
на массиве Banana
вернется «Куча бананов ". Возможно ли это, и если да, то как мне это сделать?Как создать расширение, позволяющее массиву настраиваемого типа соответствовать протоколу?
ответ
Короткий ответ: нет.
Вы можете ограничить расширение, но ограниченное расширение не может содержать предложение наследования (Swift proposal @Code. Разные, указанные выше, именно то, что вы ищете).
Одним из способов было бы сделать ограниченное расширение, но просто добавить свое собственное свойство, а не соответствовать ему CustomStringConvertible
.
class Banana : CustomStringConvertible {
var description: String {
return "a banana"
}
}
let aBanana = Banana()
aBanana.description // "a banana"
extension Array where Element: Banana {
var bananaDescription: String {
return "a bunch of bananas"
}
}
let bananas = [Banana(), Banana(), Banana()]
bananas.bananaDescription // "a bunch of bananas"
Стоит отметить также, что Array
уже соответствует CustomStringConvertible
.
let bananas = [Banana(), Banana(), Banana()]
bananas.description // "[a banana, a banana, a banana]"
Вы можете создать собственный метод в вашем классе banana, printDescription, который напечатает ваше желаемое описание. Нет необходимости создавать расширение в этом случае.
У меня уже есть это для одного банана (который соответствует CustomStringConvertable и только что названного свойства), но я хотел напечатать о коллекции бананов, а не только о каждом банане. –
Посмотрите, как вы должны подождать, пока Swift 4. Что вы описали звуки, как [это предложение] (https://github.com/apple/swift-evolution/blob/master/proposals/0143-conditional- condances.md) –
Связано: [Есть ли способ переопределить Array в String casting в Swift?] (http://stackoverflow.com/q/39046816/2976878) – Hamish
@CodeDifferent Это выглядит хорошо, но я уже могу расширить 'Sequence' с типом элемента, подобным этому' extension Sequence где Iterator.Element == Banana {...} '. Я просто хотел бы, чтобы полученная последовательность соответствовала «CustomStringConvertible» или это действительно то же самое предложение, о котором вы говорили? –