【问题标题】:Swift increment Int! not working快速递增 Int!不工作
【发布时间】:2015-10-24 03:41:30
【问题描述】:

我了解可选项的工作原理,但这让我陷入了困境。我有一个名为num 的变量,我想增加它,所以我做了以下操作:

var num:Int! = 0
num++             //ERROR - Unary operator ++ cannot be applied to an operand of type Int!

但由于某种原因,Swift 不会让我增加未包装的力 Int,即使它应该被视为普通的 Int,并且在幕后具有 nil 的功能。所以我尝试了以下方法,并且成功了:

var num:Int! = 0
num = num + 1     //NO ERROR

但是,根据它给我的错误消息,我尝试了以下方法以使增量运算符仍然有效:

var num:Int! = 0
num!++            //NO ERROR

我的问题是为什么第一位代码会中断,而第二位和第三位代码却没有?另外,既然numInt!,我不应该像普通的Int 一样对待它吗?最后,由于Int! 应该被视为普通的Int,我如何才能在第三个示例中解开它?谢谢。

【问题讨论】:

  • 由于您立即将其初始化为0,因此它不必是可选的。您可以拥有 var num = 0 而无需初始化器
  • 感谢您的信息,但无论如何,为什么我上面的代码很奇怪?
  • @JackWu:将其设为可选意味着您可以稍后将其设置为 nil,如果您有理由这样做。
  • 后缀运算符采用“inout 参数”,所以这基本上是相同的问题:Passing an implicitly unwrapped variable into inout parameter doesn't compile
  • @gnasher729 我知道可选的功能。这个问题非常清楚地表达了num 永远不会设置为nil 的意图。

标签: swift increment optional


【解决方案1】:

所有inout 参数都会出现此错误,应将其视为错误。

inout 参数通常的工作方式是它们的 getter 被调用一次,并且它们的 setter 至少被调用一次。在这种情况下,getter 返回一个Int!

let num: Int! = 0
let num2 = num // is inferred to be of type Int!

所以 getter/setter 的签名与函数/操作符所期望的不同。但是,如果将值分配给 Int 或像这样传递,编译器应该隐式解包:

var num3 = 0 // is of type Int
num3 = num // gets automatically unwrapped

// also with functions
func someFunc(i: Int) {}
someFunc(num) // gets automatically unwrapped

旁注:

如果您想将Int 传递给具有inout 参数类型为Int! 的函数,则会发生几乎相同的错误。但这里很明显为什么这不起作用(逻辑上):Int 的设置器从不接受nil

【讨论】:

    【解决方案2】:

    您使用了错误的类型Int!,请改用Int

    【讨论】:

    • 我在 ViewController 中使用它,它没有 init() 方法,我所有的初始化都在 viewDidLoad 中完成,所以它必须是某种可选的,并且不想让它成为Int?,因为那样我就不得不到处处理问号,而且在我的viewDidLoad之后它总是有一个值
    • 在声明行var num = 0中进行初始化。 Int 是默认类型
    • 感谢您的信息,但无论如何,为什么我的可选代码很奇怪?
    • 但是你的变量已经初始化了,为什么要使用 optional?而Int! 不是可选的,Int? 是可选的。在可选情况下,num!++ 是增加此变量的正确方法
    • 这并没有解决这里的真正问题,即“为什么++ 不适用于Int!”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2014-10-22
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多