所以我问了这个问题,看起来原因
var num:Int! = 0
num++
不起作用是因为++
运算符带有一个inout
参数,而隐式展开的选项不是。然而,在
var num:Int! = 0
num = num + 1
该+
运算符与隐式展开的可选项一起使用,这意味着二元运算符不需要参数inout
。所以我的问题是,为什么一元和二元运算符有不同的参数要求?Int!
对我来说,仅能将 an 与二元运算符一起使用似乎有点愚蠢,但将 anInt
与一切都使用。
所以我问了这个问题,看起来原因
var num:Int! = 0
num++
不起作用是因为++
运算符带有一个inout
参数,而隐式展开的选项不是。然而,在
var num:Int! = 0
num = num + 1
该+
运算符与隐式展开的可选项一起使用,这意味着二元运算符不需要参数inout
。所以我的问题是,为什么一元和二元运算符有不同的参数要求?Int!
对我来说,仅能将 an 与二元运算符一起使用似乎有点愚蠢,但将 anInt
与一切都使用。
为什么一元和二元运算符的参数要求不同?
好吧,这不是一元与二元的问题。有与 . 一起使用的一元运算符Int!
。例如:
var i: Int! = 17
var j = -i
-
是一元运算符,它可以工作。问题又回到了inout
. 的++
前缀和后缀运算符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
并且Int!
是两种截然不同的类型。该变量必须显式解包,或者您需要提供一个采用可选类型的重载函数。
您可能会问,为什么 Swift 不直接Int!
为您打开包装并++
使用Int
? 好吧,++
两者都修改了变量并返回了一个值。如果 Swift 解包并使用Int!
调用,那么返回的类型将是. 然后你会有人在 StackOverflow 上问,“为什么用an而不是?”。要做到这一点,需要在给定 an时返回 an ,并在给定 an时返回an 。因此,重载函数需要什么。++
Int
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 设计者没有这样做,只有他们自己知道。