Swift一元运算符,隐式解包可选

时间:2015-08-01 18:11:38

标签: swift optional unary-operator binary-operators

所以我问了this question,看起来就是

的原因
var num:Int! = 0
num++

不起作用是因为++运算符采用inout参数,而隐式展开的选项不是。但是,在

var num:Int! = 0
num = num + 1

+运算符使用隐式展开的可选项,这意味着二元运算符需要inout参数。所以我的问题是,为什么一元和二元运算符有不同的参数要求?能够仅使用二元运算符Int!,但对所有内容使用Int似乎有点愚蠢。

1 个答案:

答案 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变量需要与预期类型完全匹配且inoutInt是两种截然不同的类型。该变量必须显式展开,或者您需要提供一个采用可选类型的重载函数。

您可能会问,为什么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设计师没有做到这一点,只有他们知道原因。