如何创建扩展以允许自定义类型的数组符合协议?
How do I create an extension to allow an array of a custom type to conform to a protocol?
我有一个自定义类型 Banana
,我想创建 Array
的扩展(或者,如果必须,Sequence
) Banana
到符合协议 CustomStringConvertible
,因此在 Banana
的数组上调用 description
将 return "A bunch of bananas"。这可能吗?如果可能,我该怎么做?
您可以在 banana class 中创建一个自定义方法,printDescription,它会打印您想要的描述。在这种情况下无需创建扩展。
简答:没有。
您可以限制扩展,但受限制的扩展不能包含继承子句(上面链接的 Swift proposal @Code Different 正是您要查找的内容)。
一种解决方法是制作受限扩展,但只需添加您自己的 属性,而不是让它符合 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
,我想创建 Array
的扩展(或者,如果必须,Sequence
) Banana
到符合协议 CustomStringConvertible
,因此在 Banana
的数组上调用 description
将 return "A bunch of bananas"。这可能吗?如果可能,我该怎么做?
您可以在 banana class 中创建一个自定义方法,printDescription,它会打印您想要的描述。在这种情况下无需创建扩展。
简答:没有。
您可以限制扩展,但受限制的扩展不能包含继承子句(上面链接的 Swift proposal @Code Different 正是您要查找的内容)。
一种解决方法是制作受限扩展,但只需添加您自己的 属性,而不是让它符合 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]"