如何在需要返回值的函数中跳过返回值?

3
这是我正在使用的函数:

let values = (0..<self.data.count).map { (i) -> ChartDataEntry in
    let x = valueDate!.timeIntervalSince(startDate)
    if let a = (self.data[i]["labelvalue"] as? NSString)?.doubleValue{
        return ChartDataEntry(x: Double(x), y: a)
    } else {
        return nil
    }
}

这导致了以下错误:

Nil与返回类型“ChartDataEntry”不兼容

我该如何跳过循环而不返回任何值,并继续下一个检查?


3
请使用compactMap - Sean Lintern
2个回答

2
let values = (0..<self.data.count).compactMap { (i) -> ChartDataEntry? in
            let x = valueDate!.timeIntervalSince(startDate)
            if let a = (self.data[i]["labelvalue"] as? NSString)?.doubleValue{
                return ChartDataEntry(x: Double(x), y: a)
            }

            return nil
        }

请将您的代码替换为以下内容。

compactMap - 返回一个数组,其中包含调用给定转换器处理此序列的每个元素的非空结果。

您可以在此处了解有关compactMap的更多信息。


@sdd,如果答案对您有帮助,请标记一下答案好吗?谢谢。 - Aakash

0

基于Aakash的正确答案,使用compactMap这是一个更加Swift(和更高效)的版本

  • x是一个常量,因此在闭包外部创建它一次
  • TimeIntervalDouble的类型别名,Double(x)是多余的。
  • (压缩)映射data数组,而不是其索引。
  • 避免不必要的桥接转换。

let x = valueDate!.timeIntervalSince(startDate)
let values = self.data.compactMap { (item) -> ChartDataEntry? in
    guard let d = item["labelvalue"] as? String, let a = Double(d) else { return nil }
    return ChartDataEntry(x: x, y: a)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接