swift 3.0.2给出了雄心勃勃的错误''Type'bool'被打破了"

Sur*_*rma 4 swift swift3

我正在使用这个结构并使用它

struct Ride {
  var isRideForNow: Bool!    
}
 var sheduleRide: Ride?
 sheduleRide = Ride()
 sheduleRide?.isRideForNow = false
Run Code Online (Sandbox Code Playgroud)

当我这样使用它工作正常

 if (sheduleRide?.isRideForNow)! {
   //some code
 }
Run Code Online (Sandbox Code Playgroud)

但我不知道为什么下面的代码给出错误"类型'bool'被打破",即使这里没有可选的链接

 if (sheduleRide!.isRideForNow) {
   //some code
 }
Run Code Online (Sandbox Code Playgroud)

Ham*_*ish 6

这是一个无用的错误消息 - 它似乎只出现在Swift 3.0到3.0.2版本中.问题是Swift没有隐式地展开可选项,因为它认为你正在尝试进行可选的检查.

因此,@ vacawama说,解决方案是简单地显式解包可选:

if sheduleRide!.isRideForNow! {
    // some code
}
Run Code Online (Sandbox Code Playgroud)

(这当然会崩溃,如果任一sheduleRideisRideForNownil)

但是,在我看来,Swift没有隐含地展开IUO这一事实与SE-0054中详述的IUO行为不符- IUO应该被视为强大的选项,可以对它们进行类型检查.他们,但否则应该隐式解开.

在布尔条件下,编译器不能将表达式类型检查为强可选项,因此实际上应该隐式解包.此行为作为错误提交在此拉取请求中修复,因此声明:

if sheduleRide!.isRideForNow {
    // some code
}
Run Code Online (Sandbox Code Playgroud)

现在在Swift 3.1中编译得很好.

但实际上,正如@vadian所说,你应该考虑是否isRideForNow应该成为IUO.如果需要延迟初始化(否则
不能lazy),你应该只做一个.

如果您在初始化时给它一个值,那么它可以是非可选的:

struct Ride {
    var isRideForNow: Bool
}

var sheduleRide = Ride(isRideForNow: false)
Run Code Online (Sandbox Code Playgroud)