如何将 filter(_:) 方法添加到 Swift 中的泛型结构?

How to add filter(_:) method to generic structure in Swift?

我想给 Pyramida 结构添加一个 filter(_:) 方法。它应该采用单个参数,一个闭包:采用一个 Element 和 return 一个 Bool,以及 return 一个新的 Pyramida,其中包含闭包 return 为真的任何元素,例如值高于 10.

当我使用相同的代码(在练习中)已经存在的 func 映射也用于 func 过滤器时,它的实现只打印出 [false, false, true],而不是 10 以上的值。

还尝试按照开发人员文档中所述的语法调整 func 过滤器,但是没有进一步管理,错误太多。

struct Pyramida<Element> {
    var items = [Element]()
 
    mutating func push(_ newItem: Element) {
        items.append(newItem)
    }

    mutating func pop() -> Element? {
        guard !items.isEmpty else {return nil}
        return items.removeLast()
    }

    func map<U>(_ txform: (Element) -> U) -> Pyramida<U> {
        var mappedItems = [U]()
        for item in items {
            mappedItems.append(txform(item))
        }
        return Pyramida<U>(items: mappedItems)
    }

    func filter(_ isIncluded: (Element) -> Bool) -> Pyramida<[Int]> {
        var filteredItems = [Int]()
        for item in items {
            if item > 10 {
                filteredItems.append(filteredItems(item))
                return Pyramida(items: filteredItems)
            }
        }
    }
}

var ints = Pyramida<Int>()
ints.push(2)
ints.push(4)
ints.push(11)

var tripled = ints.map{ 3 * [=11=] }
print(String(describing: tripled.items))

var aboveTen = ints.filter{ 10 < [=11=]} // code func map<U> for filter<U>
print(String(describing: aboveTen.items))

您必须添加此方法,如果 isIncluded 为真,您必须将新元素附加到数组中。

func filter(_ isIncluded: (Element) throws -> Bool) rethrows -> Pyramida<Element> {
        var newElements: [Element] = []
        for number in items where try isIncluded(number)  {
            newElements.append(number)
        }
        return Pyramida(items: newElements)
    }

你也可以用这个。


public func filter(_ isIncluded: (Element) throws -> Bool) rethrows -> Pyramida <Element>{
        return Pyramida(items: try items.filter(isIncluded))
    }