Swift3 optionals chaining in IF conditions bug?

2020-01-28 09:31发布

This code worked just fine in Swift 2.3 and I don't understand why I have to unwrap TestClass to check if number is bigger than 4. This is whole point of chaining optionals, to save additional call.

Now to make this work, I have to check if testClass != nil (or use implicit unwrap with if let statement) and then check count.

Is this really the only way?

import UIKit

class testClass
{
    var optionalInt:Int?
}

var test:testClass?

if test?.optionalInt > 4
{

}

标签: swift swift3
4条回答
Summer. ? 凉城
2楼-- · 2020-01-28 10:09

First of all, where are you initialising your test var? Of course it'll be nil if you don't give it a value!

And regarding optional chaining, what's the issue writing :

if let optionalInt = test?.optionalInt, optionalInt > 4
{

}

As always, safety > brevity.

查看更多
Evening l夕情丶
3楼-- · 2020-01-28 10:13

This could also happen on Guard statement. Example:

var playerLevels = ["Harry": 25, "Steve": 28, "Bob": 0]

for (playerName, playerLevel) in playerLevels {

guard playerLevels > 0 else {//ERROR !!
    print("Player \(playerName) you need to do the tutorial again !")
    continue
}

print("Player \(playerName) is at Level \(playerLevels)")

}

查看更多
一纸荒年 Trace。
4楼-- · 2020-01-28 10:16

Optional comparison operators are removed from Swift 3. SE-0121

You need to write something like this:

if test?.optionalInt ?? 0 > 4
{

}
查看更多
Deceive 欺骗
5楼-- · 2020-01-28 10:19

It's not a bug. It is, alas, intentional. Implicit unwrapping of optionals in comparisons (>) has been removed from the language.

So, the problem now is that what's on the left side of the > is an Optional, and you can no longer compare that directly to 4. You have to unwrap it and get an Int, one way or another.

查看更多
登录 后发表回答