我理解选项如何工作,但这让我陷入了困境。我有一个名为num
的变量,我想增加它,所以我做了以下几点:
var num:Int! = 0
num++ //ERROR - Unary operator ++ cannot be applied to an operand of type Int!
但由于某种原因,斯威夫特不会让我增加一个展开的力量Int
,尽管它应该像普通的Int
一样被视为具有零能力的幕后花絮。所以我尝试了下面这个,它起作用了:
var num:Int! = 0
num = num + 1 //NO ERROR
但是,基于它给出的错误消息,我尝试了以下方法使增量运算符仍然有效:
var num:Int! = 0
num!++ //NO ERROR
我的问题是,当代码的第二位和第三位不在时,为什么第一位代码会中断?此外,由于num
是Int!
,我不应该像常规Int
一样对待它吗?最后,由于Int!
应该像常规Int
一样对待,我怎么能在第三个例子中解开它?感谢。
答案 0 :(得分: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
的setter从不接受nil
。
答案 1 :(得分:-3)
您使用了错误的Int!
类型,而是使用Int