如何在Swift中实现过滤功能

时间:2016-02-23 18:00:14

标签: arrays swift

为了更好地了解Swift,我已经扩展2 5 以添加我自己的SequenceTypemapreduce函数版本。但是,forEach函数的不同之处在于它返回filter的数组。这就是我到目前为止所拥有的:

Self.Generator.Element

语句extension SequenceType { public func myFilter(@noescape includeElement: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.Generator.Element] { var array = [Self.Generator.Element]() for element in self { do { if try includeElement (element) { array.append(element) } } } return array } } 产生"无效使用()来调用非函数类型的值[Self.Generator.Element.Type]"错误。我的问题是如何创建/添加/返回var array = [Self.Generator.Element]()数组?

2 个答案:

答案 0 :(得分:4)

不确定原因,但Xcode可以使用以下语法:

extension SequenceType {
    public func myFilter(@noescape includeElement: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.Generator.Element] {
        var array : [Self.Generator.Element] = []
        for element in self {
            do {
                if try includeElement (element) {
                    array.append(element)
                }
            }
        }
        return array
    }
}

唯一的变化是数组声明(var array : [Self.Generator.Element] = [])。

答案 1 :(得分:4)

斯威夫特的类型推断让你对你的意思感到困惑。这可能意味着两件事:

var array = [Self.Generator.Element]()

您可能意味着(并且确实意味着)您要为类型Array<Self.Generator.Element>调用构造函数。

但是你可能意味着(并且编译器认为你的意思)你想创建一个Self.Generator.Element.Type的数组,然后你想把它称为函数。

我不记得这在过去是一个编译器混乱,它可能是一个回归。也就是说,这是模棱两可的(虽然最后只有一个真的有意义,我认为你需要在那里说Generator.Element.self来引用这个类型,所以也许这是真的编译器错误)。您可以使用首选方法初始化数组,通过使用类型:

来消除歧义
var array: [Self.Generator.Element] = []