为什么一元和二元运算符有不同的参数
要求?
嗯,这不是一元与二元的问题。有与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! 并使用 Int 调用 ++,那么返回的类型将是 Int。然后你会有人在 StackOverflow 上问,“为什么 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 的设计者没有这样做,只有他们自己知道。