nil合并运算符’??’的左侧 具有非可选类型’Int’,因此从swift 1.2到4转换后,右侧是从不使用警告

我已经将一条线从swift 1.2转换为swift 4但它仍然提供警告建议。 如果我删除该警告,它正在删除添加中的一个值。 有人可以建议我做任何错误转换为swift 4

Swift 1.2 —–> let sumEmailRemoved = account.numMessageArchived.integerValue ?? 0 + account.numMessageDeleted.integerValue ?? 0 let sumEmailRemoved = account.numMessageArchived.integerValue ?? 0 + account.numMessageDeleted.integerValue ?? 0

Swift 4 ——> let sumEmailRemoved = account.numMessageArchived.intValue ?? 0 + account.numMessageDeleted.intValue ?? 0 let sumEmailRemoved = account.numMessageArchived.intValue ?? 0 + account.numMessageDeleted.intValue ?? 0

我正在尝试将一个方法从swift 1.2转换为swift 4但它满足了真正的要求。 有人可以正确转换或给你宝贵的建议,让我完美。

下面的Swift 1.2代码—->

 func checkShouldAllow() -> Bool { let productPurchased = NSUserDefaults.standardUserDefaults().boolForKey(kFullVersionProductId) if productPurchased { return true } if let account = account { let sumEmailRemoved = account.numMessageArchived.integerValue ?? 0 + account.numMessageDeleted.integerValue ?? 0 if sumEmailRemoved > numCap { return false } } let numContactsRemoved = NSUserDefaults.standardUserDefaults().integerForKey(kNumContactsRemoved) println(numContactsRemoved) return numContactsRemoved < numContactsCap } 

需要Swift 4代码—->

正如您可以从错误消息中推断出的那样, account.numMessageArchived.intValueaccount.numMessageDeleted.intValue中的一个(但我猜两者)现在都是非可选的,因此?? 是多余的。 尝试:

 let sumEmailRemoved = account.numMessageArchived.intValue + account.numMessageDeleted.intValue 

这是关于运营商的优先级关联性。

优先级 =操作顺序 。 例如,*高于+,因此首先评估:

 1 + 2 * 3 = 1 + (2 * 3) = 7 

关联性 =首先是左或右组。 例如,+是左关联的,因此它是从左侧组中评估的:

 1 + 2 + 3 = ((1 + 2) + 3) = 6 

回到你的问题。 首先,让我们简化代码:

 var num1: Int? = 0 var num2: Int = 0 // I believe this is non-optional, or else compiler will give another error. let result = num1 ?? 0 + num2 ?? 0 

现在令人惊讶的是,+具有更高的优先级而不是?? 运营商。 所以先完成它:

 num1 ?? (0 + num2) ?? 0 num1 ?? 0 ?? 0 

然后, ?? 是正确的关联 ,所以从右边计算:

 (num1 ?? (0 ?? 0)) 

(0 ?? 0)的左边0已经是非可选的。 这就是它发出警告的原因:

nil合并运算符’??’的左侧 具有非可选类型’Int’,因此从不使用右侧


解决方案是使用括号更清晰:

 let result = (num1 ?? 0) + num2 

在这里查看优先级和关联性表,从高到低排序: https : //developer.apple.com/documentation/swift/operator_declarations