所以我问了this question,看起来就是
的原因var num:Int! = 0
num++
不起作用是因为++
运算符采用inout
参数,而隐式展开的选项不是。但是,在
var num:Int! = 0
num = num + 1
+
运算符使用隐式展开的可选项,这意味着二元运算符不需要inout
参数。所以我的问题是,为什么一元和二元运算符有不同的参数要求?能够仅使用二元运算符Int!
,但对所有内容使用Int
似乎有点愚蠢。
答案 0 :(得分:3)
为什么一元和二元运算符有不同的参数 要求?
嗯,这不是一元二问题。有一元运算符与Int!
一起使用。例如:
var i: Int! = 17
var j = -i
-
是一元运算符,它可以运行。问题回到inout
的问题。 ++
的{{1}}前缀和后缀运算符不能与Int
一起使用,因为变量是Int!
传递的(因为inout
修改了原始变量除了返回值)。 ++
要求类型完全匹配。
请注意,隐式展开的期权仍然是期权。
inout
因此,将隐式展开的可选项作为需要非可选类型的var i: Int! = 17
var k = i // k has the type Int!
var m = i! // m has the type Int
变量传递不起作用,因为inout
变量需要与预期类型完全匹配且inout
和Int
是两种截然不同的类型。该变量必须显式展开,或者您需要提供一个采用可选类型的重载函数。
您可能会问,为什么Swift不为您打开Int!
并使用Int!
致电++
?好吧,Int
都修改变量并返回一个值。如果Swift打开++
并使用Int!
调用++
,则返回的类型将为Int
。然后,您有人在StackOverflow上询问,"为什么Int
使var i: Int! = 17; var j = i++
成为j
而不是Int
?"。要做得好,Int!
需要在++
给出Int
时返回Int
,并在给Int!
时返回Int!
。那么,重载函数需要什么。
可以为++
重载++
并制作Int!
前缀和后缀函数:
prefix func ++(inout x: Int!) -> Int! {
return ++x!
}
postfix func ++(inout x: Int!) -> Int! {
return x!++
}
var i: Int! = 17
var j = ++i
print("i = \(i), j = \(j)") // "i = 18, j = 18"
j = i++
print("i = \(i), j = \(j)") // "i = 19, j = 18"
至于为什么Swift设计师没有做到这一点,只有他们知道原因。