所以我问了这个问题,看起来原因
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 。因此,重载函数需要什么。++IntIntvar i: Int! = 17; var j = i++jIntInt!++IntIntInt!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 设计者没有这样做,只有他们自己知道。