过滤类别/扩展中的数组

时间:2014-07-06 13:19:09

标签: ios arrays swift

为方便起见,在我正在进行的一个小实验中,我想扩展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>'

关于我做错了什么的任何线索?谢谢!

2 个答案:

答案 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() }
    }
}

但请不要。