我有这段代码,但它显示错误:
extension Collection {
func removingOptionals() -> [Element] {
var result = [Element](); // Error: cannot call value of non-function type '[Self.Element.Type]'
self.forEach({ (element) in if let el = element { result.append(el); } });
return result;
}
}
如果我删除()
,则错误变为:Expected member name or constructor call after type name
。
此代码应该通过丢弃所有空值来将[String?]
转换为[String]
。或任何其他可选数据类型。
我该怎么做?
答案 0 :(得分:3)
您可以使用flatMap {}
代替创建自己的功能。以下是使用示例:
let strings: [String?] = ["One", nil, "Two"]
print(strings.flatMap { $0 })
结果将是["One", "Two"]
答案 1 :(得分:0)
您可以继续使用Optional的flatMap行为,如另一个答案所示,但它将是deprecated on the next Swift iteration。
如果要将扩展名添加到集合类型,则需要创建一个类型以选中“可选”(如果类型是通用的,则无法扩展集合,如可选)。
protocol OptionalType {
associatedtype Wrapped
func map<U>(_ f: (Wrapped) throws -> U) rethrows -> U?
}
extension Optional: OptionalType {}
extension Collection where Iterator.Element: OptionalType {
func removeNils() -> [Iterator.Element.Wrapped] {
var result: [Iterator.Element.Wrapped] = []
result.reserveCapacity(Int(self.count))
for element in self {
if let element = element.map({ $0 }) {
result.append(element)
}
}
return result
}
}