类别/扩展中的过滤器数组

Posted

技术标签:

【中文标题】类别/扩展中的过滤器数组【英文标题】:Filter array in a category/extension 【发布时间】:2014-07-06 13:19:09 【问题描述】:

为方便起见,在我正在做的一个小实验中,我想扩展 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&lt;Section&gt;' to type 'Array&lt;Section&gt;'

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

【问题讨论】:

【参考方案1】:

这是因为您正在扩展 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() 
    

但请不要。

【讨论】:

【参考方案2】:

问题在于,由于Array 类实际上是一个通用的Array&lt;T&gt;,因此您正在扩展Array&lt;T&gt;。显然你不能在泛型类型之间进行转换(即&lt;T&gt;&lt;Section&gt;),所以我相信你必须创建一个新数组并将适当的对象推入其中。

 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. 

您还可以创建一个辅助方法来为您在泛型类型之间进行转换,但在这种情况下,这只会创建一个不必要的临时对象。

请记住,该语言仍在大量变化中,因此这可能会发生变化。我认为我们不太可能获得在泛型类型之间进行转换的能力,但我希望我们至少能够扩展特定的泛型。

【讨论】:

以上是关于类别/扩展中的过滤器数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在mouseover事件中删除limitTo过滤器的限制?

Laravel 复选框过滤器 ajax

WordPress |帖子查询 |查询帖子类别以创建子类别过滤器并将其应用于我的函数文件中的 Ajax 过滤器

Magento 类别页面未包含属性过滤器中的所有产品

论文写作分析之五《融合类别特征扩展与N-gram子词过滤的fastText短文本分类》

论文写作分析之五《融合类别特征扩展与N-gram子词过滤的fastText短文本分类》