为方便起见,在我正在进行的一个小实验中,我想扩展Array以提供一些特定于应用程序的功能。这个特定的扩展不是最佳实践,但我只是对解决我遇到的Swift问题感到好奇。
给定一个自定义类Section,我的扩展(带有部分扩展的闭包)是:
extension Array {
func onlyFullSection() -> Array<Section> {
return self.filter {
(a:Section) -> Bool in
return a.isFullSection()
}
}
}
我得到的错误是:“T”不是“Section”的子类型。
我尝试用所有调味料(改变类型,铸造等等)来修复它,但仍然会遇到类似的错误。
另一个变种:
extension Array {
func onlyFullSection() -> Array<Section> {
return (self as Array<Section>).filter {
(a:Section) -> Bool in
return a.isFullSection()
} as Array<Section>
}
抛出:Cannot convert the expression's type 'Array<Section>' to type 'Array<Section>'
关于我做错了什么的任何线索?谢谢!
答案 0 :(得分:0)
问题在于,由于Array
类实际上是通用Array<T>
,因此您正在扩展Array<T>
。显然你不能在泛型类型(即<T>
到<Section>
)之间进行转换,所以我相信你必须创建一个新数组并将相应的对象推入其中。
17> extension Array {
18. func onlyFullSection() -> Array<Section> {
19. var ary = Array<Section>()
20. for s in self {
21. if (s as Section).isFullSection() {
22. ary.append(s as Section)
23. }
24. }
25. return ary
26. }
27. }
您还可以创建一个辅助方法来为您转换泛型类型,但在这个实例中只会创建一个不必要的临时对象。
请记住,语言仍然处于不稳定状态,因此可能会发生变化。我认为我们不太可能在通用类型之间进行投射,但我希望我们至少能够扩展特定的泛型。
答案 1 :(得分:0)
这是因为你正在扩展T []而不是Section []。这意味着Int []也将有你的额外方法。这可能不是最好的主意(因为它会严重崩溃)。
Swift目前不允许扩展一个专门的泛型类型,如Section []。
但是,如果你真的,真的想要这样做,这是强制演员阵容的一种方法,请使用reinterpretCast
,Apple描述如下
/// A brutal bit-cast of something to anything of the same size
func reinterpretCast<T, U>(x: T) -> U
你可以像这样使用它:
extension Array {
func onlyFullSection() -> Section[] {
let sections : Section[] = reinterpretCast(self)
return sections.filter{ $0.isFullSection() }
}
}
但请不要。