如何在期望值的函数中跳过返回值

时间:2018-11-13 10:33:08

标签: swift return

这是我正在使用的功能:

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
    }
}

这导致此错误:

  

无与返回类型'ChartDataEntry'不兼容

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

2 个答案:

答案 0 :(得分: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 here

的更多信息

答案 1 :(得分:0)

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

  • 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)
}