【问题标题】:Why wont this conditional work in Swift 3?为什么这个条件在 Swift 3 中不起作用?
【发布时间】:2017-02-02 04:16:13
【问题描述】:

嘿,在 Swift 3 之前我以前使用过:

if CustomUser.sharedInstance.numberOfCredits > 0 {
}

其中numberOfCreditsDouble?。现在我得到了错误:Binary operator '>' cannot be applied to 'Double?' 类型的操作数和'Int'。为什么是这样?所以我将 0 更改为 0.0 并得到 Binary operator '>' cannot be applied to 'Double?' 类型的操作数和“双”。为什么这条线在 Swift 3 中不起作用?

【问题讨论】:

  • 你能显示你的共享实例和函数吗?可能是选项有问题。
  • 试试这个:if CustomUser.sharedInstance.numberOfCredits! > 0.0
  • 请查看this

标签: ios swift swift3


【解决方案1】:
struct CustomerUser {
  static var sharedInstance = Instance()
}

struct Instance {
  var numberOfCredits: Double?
}

let credits = CustomerUser.sharedInstance.numberOfCredits ?? 0.0

if credits > 0 {
  print("credits greater than zero")
}

numberOfCreditsOptional Double(Double?)意味着它可能包含 nilDouble 值 .

这就是为什么如果 numberOfCredits 为 nil 时编译器不知道该怎么做。

if CustomUser.sharedInstance.numberOfCredits > 0 // wtf ?

为了将 Double? 转换为 Double,您可以使用 ?? 运算符,它不仅会在 的情况下进行转换numberOfCredits 包含一个 Double 值,但如果 numberOfCredits 包含 nil 将返回 0.0,这有多酷? ??

let credits = CustomerUser.sharedInstance.numberOfCredits ?? 0.0

【讨论】:

    【解决方案2】:

    Swift 3 删除了具有相同基类型的可选和非可选之间的比较。你有三个选项来处理这个问题:

    • 如果您知道它不是nil,则使用! 显式解包该值,
    • 使用if let 构造解包可选,
    • 使用nil 合并运算符

    下面是第三个选项的使用方法:

    if CustomUser.sharedInstance.numberOfCredits ?? 0 > 0 {
    }
    

    注意:numberOfCredits 有可能被省略为可选 - 例如,因为 sharedInstance 被定义为可选而没有自动展开。在这种情况下,最好解决根本问题,而不是使用??! 作为解决方法。

    【讨论】:

      【解决方案3】:

      这不起作用,因为您的 numberOfCreditsOptional (Double?)。应该是:0121 Remove Optional Comparison Operators

      这样做:

      if let v = CustomUser.sharedInstance.numberOfCredits, v > 0 {
      }
      

      P.S.:除此之外:numberOfCredits 听起来应该是 Int,而不是 Double?也许它也不应该是Optional - 如果没有学分,它应该是0?很难说不知道你在做什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-23
        • 2020-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        相关资源
        最近更新 更多