2017-01-06 32 views
0

我有一個自定義類型Banana和我想創建的Array的延伸部(或者,如果非要,Sequence)的Banana以符合協議CustomStringConvertible使得Banana陣列上調用description將返回「一束香蕉「。這是可能的,如果是這樣,我會怎麼做呢?如何創建一個擴展,允許自定義類型的數組,以符合協議?

+2

看起來像你必須要等到斯威夫特4.你所描述的一樣[這個提議](https://github.com/apple/swift-evolution/blob/master/proposals/0143-conditional-聲音conformances.md) –

+1

相關:[?有沒有辦法覆蓋到數組中的字符串斯威夫特鑄造(http://stackoverflow.com/q/39046816/2976878) – Hamish

+0

@CodeDifferent這看起來不錯,但我已經可以延長'序列'與一個元素類型像這樣'擴展序列,其中Iterator.Element ==香蕉{...}'。我只想讓結果順序符合'CustomStringConvertible'或者這是你提到的相同的提議? –

回答

1

簡短的回答:沒有。

您可以約束擴展,但受約束的擴展不能包含繼承子句(Swift proposal @代碼上面的不同鏈接正是您正在查找的內容)。

一種解決方法是使受約束的擴展,而只是添加自己的屬性,而不是它符合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

你可以在你的香蕉類,printDescription創建自定義的方法,該方法將打印您所需的說明。在這種情況下無需創建擴展名。

+0

我已經得到了單個香蕉(這不符合CustomStringConvertable和財產只是所謂的說明),但我想打印有關香蕉的集合,而不只是每個香蕉。 –

相關問題