【问题标题】:How to use max with swift3?如何在 swift3 中使用 max?
【发布时间】:2017-04-07 16:27:07
【问题描述】:

下面的代码出现错误:

var bubbleWidth:CGFloat!
bubbleWidth:CGFloat = max( CGFloat(15) , bubbleWidth )

这里是错误信息: 没有候选人产生预期的上下文结果类型'cgfloat!'

这段代码在 swift 2 上运行没有任何问题,我不知道为什么我现在得到这个错误!

编辑: 这是我的真实代码:

    var bubbleWidth:CGFloat!
        bubbleWidth = imageView.frame.width + 11

    bubbleWidth =   max( CGFloat(15) ,
                          bubbleWidth )

这是我收到的错误:

编辑: 请注意:我不想像那样为bubbleWidth赋值 var bubbleWidth:CGFloat = -1

谢谢

【问题讨论】:

  • max 表达式中的 bubbleWidthnil(无值)。你期待什么?
  • 第二行中的:CGFloat 语法是否有效?
  • 你看到错字了吗?它应该是 CGFloat 而不是 CGFLoat
  • 即使没有 CGFLoat 拼写错误,该代码也无法在任何 Swift 版本中编译。
  • @david:我将您的代码复制到 Xcode 7 中:它确实用 Swift 2 编译。

标签: swift swift3 max cgfloat


【解决方案1】:

这是SE-0054 Abolish ImplicitlyUnwrappedOptional type 的结果,它已在 Swift 3 中实现:

但是,外观!在属性或变量声明的类型的末尾不再指示该声明具有 IUO 类型;相反,它表明 (1) 声明具有可选类型,并且 (2) 声明具有指示其值可能被隐式强制的属性。 ...

如果表达式可以使用强可选类型进行显式类型检查,则可以。但是,如果需要,类型检查器将退回到强制可选。

现在有人可能会争辩说编译器应该退回到展开

中的可选项
bubbleWidth = max(CGFloat(15), bubbleWidth)

但由于某种原因,它只适用于浮点 literal

bubbleWidth = max(15, bubbleWidth)

我不确定这是否是一个错误。或者,显式解开值

bubbleWidth = max(CGFloat(15), bubbleWidth!)

或者 - 更好 - 使用 nil-coalescing 运算符 ?? 提供默认值:

bubbleWidth = max(CGFloat(15), bubbleWidth ?? 0)

【讨论】:

  • 非常感谢,但我真的很困惑,这是我第一次知道我应该解开CGfloat! .我知道如果我以这种方式声明它,我应该打开它 CGFloat?
  • @david:看看 SE-0054。 CGF浮动!大多被视为 CGFloat?现在。
  • 能否给个苹果官方链接?
  • 我已经给了你 SE-0054 的链接。您还可以在 swift.org/blog/swift-3-0-released 上找到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
相关资源
最近更新 更多