Swift 使用Double初始化整数时出现意外的nil

Swift 使用Double初始化整数时出现意外的nil,swift,Swift,我试图了解以下场景中发生的情况: 让输入:[Double]=[2.3] //情景1 input.compactMap{Int.init$0}/[2] //情景2 input.compactMapInt.init//[] 场景1给出了一个包含2的数组,如预期的那样。Double是四舍五入的,并转换为Int。但是,场景2给出了一个空数组,因为给定的Double显然不能转换为Int 有人能解释一下这里发生了什么吗?我希望这两种场景都能给出相同的输出。我通过检查不同的.init方法找到了答案 在场景1中

我试图了解以下场景中发生的情况:

让输入:[Double]=[2.3] //情景1 input.compactMap{Int.init$0}/[2] //情景2 input.compactMapInt.init//[] 场景1给出了一个包含2的数组,如预期的那样。Double是四舍五入的,并转换为Int。但是,场景2给出了一个空数组,因为给定的Double显然不能转换为Int


有人能解释一下这里发生了什么吗?我希望这两种场景都能给出相同的输出。

我通过检查不同的.init方法找到了答案

在场景1中,使用以下初始化器:

初始源:双精度 在场景2中,使用该初始化器时:

init?正是来源:Double 我的期望是在这里使用相同的初始化器,因为我没有给出任何标签来表明我指的是另一个初始化器。我猜这+使用compactMap的组合使swift更喜欢场景2中使用的初始化器,因为使用普通映射而不是compactMap会产生预期的结果

目前的解决方案是明确声明我要使用场景1中的初始化器:

input.compactMapInt.init_quot://[2]
我通过检查不同的.init方法找到了答案

在场景1中,使用以下初始化器:

初始源:双精度 在场景2中,使用该初始化器时:

init?正是来源:Double 我的期望是在这里使用相同的初始化器,因为我没有给出任何标签来表明我指的是另一个初始化器。我猜这+使用compactMap的组合使swift更喜欢场景2中使用的初始化器,因为使用普通映射而不是compactMap会产生预期的结果

目前的解决方案是明确声明我要使用场景1中的初始化器:

input.compactMapInt.init_quot://[2]
为了完成回答,Swift使用与参数类型最匹配的初始值设定项,compactMap期望一个返回可选初始值的闭包?确切地说:是可失败的并返回可选值。为了完成回答,Swift使用与参数类型最匹配的初始值设定项,compactMap期望一个闭包返回一个可选的init?确切地说:是failable并返回一个可选的init