1

所以我问了这个问题,看起来原因

var num:Int! = 0
num++

不起作用是因为++运算符带有一个inout参数,而隐式展开的选项不是。然而,在

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

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

4

1 回答 1

3

为什么一元和二元运算符的参数要求不同?

好吧,这不是一元与二元的问题。有与 . 一起使用的一元运算符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 设计者没有这样做,只有他们自己知道。

于 2015-08-01T18:36:27.177 回答