我有此代码,但显示出错误:
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]
。或任何其他可选数据类型。
我该怎么做?
您可以将flatMap {}
使用,而不是创建自己的函数。这是用法的示例:
let strings: [String?] = ["One", nil, "Two"]
print(strings.flatMap { $0 })
结果将是["One", "Two"]
您可以在其他答案中继续使用可选的扁平图行为,但是将在下一个迅速迭代中对其进行弃用。
如果要将扩展名添加到集合类型中,则需要成为一个创建类型来框架(如果类型是通用的,例如可选的(。
。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
}
}