Swift闭包返回空值

时间:2017-06-14 04:02:53

标签: swift closures

我正在读这篇关于高阶函数的文章

https://medium.com/@mimicatcodes/simple-higher-order-functions-in-swift-3-0-map-filter-reduce-and-flatmap-984fa00b2532

然后我开始玩弄它们并找到了这个:

let someArray = [1, 2, 3, 4, 5]

let newArray  = someArray.map {
    print($0)
    $0 * 2
}
print(a)

这会在newArray

中返回空值

enter image description here

删除print函数或专门设置函数的返回类型时会起作用:

let a  = someArray.map { number -> Int in
    print(number)
    return number * 2
}
print(a)

enter image description here

有任何解释吗?

2 个答案:

答案 0 :(得分:2)

这是因为如果您在关闭中使用速记参数名称,则必须从第一行返回,即内联返回。
在你的第一个关闭中,你的第一行是print(),它不会返回任何内容。 如果你喜欢这样:

let newArray  = someArray.map {
  $0 * 2
}

或者只是这个:

let newArray  = someArray.map { $0 * 2 }

你会得到结果。

详细了解此here in developer docs

<强>更新 如@hamish所示,可以使用速记参数进行多次计算,但是我们需要明确提及结果的数据类型以及return语句:

let newArray: [Int] = someArray.map {
  print($0)
  return $0 * 2
}

答案 1 :(得分:1)

如果你不在一个应该返回一些东西的闭包中使用return,那么就会返回第一个语句的结果。在这种情况下,()函数返回的void(也就是空元组:print)。

在地图关闭中调用print之类的函数是不好的做法,因为它可能有副作用,应该避免使用。