2017-01-06 4 views
0

У меня есть пользовательский тип Banana, и я хотел бы создать расширение Array (или, если я должен, Sequence) из Banana в соответствии с протоколом CustomStringConvertible так, что вызов description на массиве Banana вернется «Куча бананов ". Возможно ли это, и если да, то как мне это сделать?Как создать расширение, позволяющее массиву настраиваемого типа соответствовать протоколу?

+2

Посмотрите, как вы должны подождать, пока Swift 4. Что вы описали звуки, как [это предложение] (https://github.com/apple/swift-evolution/blob/master/proposals/0143-conditional- condances.md) –

+1

Связано: [Есть ли способ переопределить Array в String casting в Swift?] (http://stackoverflow.com/q/39046816/2976878) – Hamish

+0

@CodeDifferent Это выглядит хорошо, но я уже могу расширить 'Sequence' с типом элемента, подобным этому' extension Sequence где Iterator.Element == Banana {...} '. Я просто хотел бы, чтобы полученная последовательность соответствовала «CustomStringConvertible» или это действительно то же самое предложение, о котором вы говорили? –

ответ

1

Короткий ответ: нет.

Вы можете ограничить расширение, но ограниченное расширение не может содержать предложение наследования (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]" 
0

Вы можете создать собственный метод в вашем классе banana, printDescription, который напечатает ваше желаемое описание. Нет необходимости создавать расширение в этом случае.

+0

У меня уже есть это для одного банана (который соответствует CustomStringConvertable и только что названного свойства), но я хотел напечатать о коллекции бананов, а не только о каждом банане. –