类别/扩展中的过滤器数组
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<Section>' to type 'Array<Section>'
关于我做错了什么的任何线索?谢谢!
【问题讨论】:
【参考方案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<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.
您还可以创建一个辅助方法来为您在泛型类型之间进行转换,但在这种情况下,这只会创建一个不必要的临时对象。
请记住,该语言仍在大量变化中,因此这可能会发生变化。我认为我们不太可能获得在泛型类型之间进行转换的能力,但我希望我们至少能够扩展特定的泛型。
【讨论】:
以上是关于类别/扩展中的过滤器数组的主要内容,如果未能解决你的问题,请参考以下文章
如何在mouseover事件中删除limitTo过滤器的限制?
WordPress |帖子查询 |查询帖子类别以创建子类别过滤器并将其应用于我的函数文件中的 Ajax 过滤器