如何将 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))
}
我想给 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))
}