【问题标题】:Null coalescing operator with bool带有布尔值的空值合并运算符
【发布时间】:2015-04-02 09:47:05
【问题描述】:

我正在尝试将 som Objective-C 代码转换为 swift,但我坚持使用以下语句。

我将如何转换:

self.viewController.view.alpha = !self.viewDisabled ?: 0;

快速?

viewController.view.alpha = !self.viewDisabled ?? 0

Swift 中的空值合并运算符似乎不起作用,因为我得到一个 "Binary Operator '??'不能应用于 'bool' 类型的操作数” 错误。 我究竟做错了什么?

【问题讨论】:

  • 顺便说一句,在您的 Objective-C 示例中,使用 ?: 是完全没有必要的。 !self.viewDisabled ?: 0!self.viewDisabled 相同

标签: ios swift


【解决方案1】:

Nil-coalescing operator 与布尔值无关。

使用完整形式的三元运算符:

viewController.view.alpha = viewDisabled ? 0 : 1

【讨论】:

    【解决方案2】:

    Nil 合并用于可选变量。如文档中所述,nil 合并对应于:

    a != nil ? a! : b    //if a has value, return unwrapped value of a, else return b
    

    考虑这些例子:

    var optionalBoolean : Bool? //don't have value (or == nil)
    var falseBoolean : Bool = false
    
    var a = optionalBoolean ?? true //return true cause optionalBoolean does not have value, so it return 'true'
    var b = falseBoolean ?? true //return false cause falseBoolean has value = false.
    

    【讨论】:

    • 当苹果说“a ?? ba != nil ? a! : b 的简写”时,你可以使用var b = falseBoolean ?? true 但不能使用var c = falseBoolean != nil ? falseBoolean! : true,这有点奇怪。
    • 你不能。因为 falseBoolean 不是可选变量。您无法将其与 nil 进行比较。
    • 那你为什么可以var b = falseBoolean ?? true呢?
    • 啊,我错过了理解你的答案。我认为 Apple 例外,允许使用 ?? 进行非可选(非零)变量。但是,当您进行 A 与 B 的比较时,A 必须与 B 具有可比性。也就是说,A 必须与 B 是同一种对象,或者 A 必须可以转换为 B。
    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 2013-03-02
    • 2012-09-20
    • 2016-09-28
    • 2013-06-06
    • 2021-08-29
    • 2021-04-20
    相关资源
    最近更新 更多