“++”和“ – ”运算符已被弃用Xcode 7.3

我在看Xcode 7.3笔记,我注意到这个问题。

++和 – 运算符已被弃用

有人可以解释为什么它被弃用吗? 我是正确的,在新版本的Xcode现在你要使用,而不是++这个x += 1 ;

例:

 for var index = 0; index < 3; index += 1 { print("index is \(index)") } 

截图警告

Swift创build者Chris Lattner的完整解释 。 我将总结一下几点:

  1. 这是学习Swift时需要学习的另一个function
  2. 不比x += 1短得多
  3. Swift不是C.不应该只为了取悦C程序员而把它们带走
  4. 它的主要用途是C风格for循环: for i = 0; i < n; i++ { ... } for i = 0; i < n; i++ { ... } for i = 0; i < n; i++ { ... } ,其中Swift有更好的select,像for i in 0..<n { ... } (C型循环也出去了 )
  5. 对于例如x - ++xfoo(++x, x++)什么?
  6. Chris Lattner不喜欢它。

对于那些有兴趣(并避免链接腐败),拉特纳用他自己的话说是:

  1. 这些运算符增加了学习Swift作为第一种编程语言的负担 – 或者您还不知道其他语言的这些运算符的情况。

  2. 他们的performance优势是最小的–x + +并不比x + = 1短得多。

  3. Swift已经偏离了C中的=,+ =和其他赋值types的操作返回Void(出于许多原因)。 这些运营商与该模式不一致。

  4. Swift具有强大的function,可以消除许多常见原因,因为在其他语言中,使用++ I循环的C样式循环,所以这些在写得很好的Swift代码中使用得比较less。 这些function包括for-in循环,范围,枚举,映射等

  5. 实际上使用这些操作符的结果值的代码通常会让代码的读者/维护者感到困惑和微妙。 他们鼓励“过于棘手”的代码,这可能是可爱的,但难以理解。

  6. 虽然Swift具有明确的评估顺序,但任何依赖于它的代码(如foo(++ a,a ++)),即使定义良好,也是不可取的。

  7. 这些运算符适用于相对较less的types:整型和浮点型标量以及类似迭代器的概念。 它们不适用于复数,matrix等

最后,这些失败的指标“如果我们还没有这些,我们会把它们添加到Swift 3吗?

我意识到,这个评论并没有回答这个问题,但是可能有人正在寻找一个解决scheme,如何让这些操作员工作,这样的解决scheme可以在底部find。 😇

我个人更喜欢++--运营商。 我不同意他们是棘手或难以pipe理的意见。 一旦开发人员了解了这些操作员所做的事情(我们正在谈论非常简单的事情),代码应该非常清晰。

在解释为什么运营商被弃用的提到,他们的主要用途是在C风格的循环。 我不了解别人,但是我个人根本不使用C风格的循环,当++--操作符是有用的时候,还有许多其他的地方或情况。

我想还提到, varName++返回一个值,所以它可以在return使用,而varName += 1不能。

对于任何想要让这些操作员在这里工作的人是解决scheme:

 prefix operator ++ {} postfix operator ++ {} prefix operator -- {} postfix operator -- {} // Increment prefix func ++(inout x: Int) -> Int { x += 1 return x } postfix func ++(inout x: Int) -> Int { x += 1 return (x - 1) } prefix func ++(inout x: UInt) -> UInt { x += 1 return x } postfix func ++(inout x: UInt) -> UInt { x += 1 return (x - 1) } prefix func ++(inout x: Int8) -> Int8 { x += 1 return x } postfix func ++(inout x: Int8) -> Int8 { x += 1 return (x - 1) } prefix func ++(inout x: UInt8) -> UInt8 { x += 1 return x } postfix func ++(inout x: UInt8) -> UInt8 { x += 1 return (x - 1) } prefix func ++(inout x: Int16) -> Int16 { x += 1 return x } postfix func ++(inout x: Int16) -> Int16 { x += 1 return (x - 1) } prefix func ++(inout x: UInt16) -> UInt16 { x += 1 return x } postfix func ++(inout x: UInt16) -> UInt16 { x += 1 return (x - 1) } prefix func ++(inout x: Int32) -> Int32 { x += 1 return x } postfix func ++(inout x: Int32) -> Int32 { x += 1 return (x - 1) } prefix func ++(inout x: UInt32) -> UInt32 { x += 1 return x } postfix func ++(inout x: UInt32) -> UInt32 { x += 1 return (x - 1) } prefix func ++(inout x: Int64) -> Int64 { x += 1 return x } postfix func ++(inout x: Int64) -> Int64 { x += 1 return (x - 1) } prefix func ++(inout x: UInt64) -> UInt64 { x += 1 return x } postfix func ++(inout x: UInt64) -> UInt64 { x += 1 return (x - 1) } prefix func ++(inout x: Double) -> Double { x += 1 return x } postfix func ++(inout x: Double) -> Double { x += 1 return (x - 1) } prefix func ++(inout x: Float) -> Float { x += 1 return x } postfix func ++(inout x: Float) -> Float { x += 1 return (x - 1) } prefix func ++(inout x: Float80) -> Float80 { x += 1 return x } postfix func ++(inout x: Float80) -> Float80 { x += 1 return (x - 1) } prefix func ++<T : _Incrementable>(inout i: T) -> T { i = i.successor() return i } postfix func ++<T : _Incrementable>(inout i: T) -> T { let y = i i = i.successor() return y } // Decrement prefix func --(inout x: Int) -> Int { x -= 1 return x } postfix func --(inout x: Int) -> Int { x -= 1 return (x + 1) } prefix func --(inout x: UInt) -> UInt { x -= 1 return x } postfix func --(inout x: UInt) -> UInt { x -= 1 return (x + 1) } prefix func --(inout x: Int8) -> Int8 { x -= 1 return x } postfix func --(inout x: Int8) -> Int8 { x -= 1 return (x + 1) } prefix func --(inout x: UInt8) -> UInt8 { x -= 1 return x } postfix func --(inout x: UInt8) -> UInt8 { x -= 1 return (x + 1) } prefix func --(inout x: Int16) -> Int16 { x -= 1 return x } postfix func --(inout x: Int16) -> Int16 { x -= 1 return (x + 1) } prefix func --(inout x: UInt16) -> UInt16 { x -= 1 return x } postfix func --(inout x: UInt16) -> UInt16 { x -= 1 return (x + 1) } prefix func --(inout x: Int32) -> Int32 { x -= 1 return x } postfix func --(inout x: Int32) -> Int32 { x -= 1 return (x + 1) } prefix func --(inout x: UInt32) -> UInt32 { x -= 1 return x } postfix func --(inout x: UInt32) -> UInt32 { x -= 1 return (x + 1) } prefix func --(inout x: Int64) -> Int64 { x -= 1 return x } postfix func --(inout x: Int64) -> Int64 { x -= 1 return (x + 1) } prefix func --(inout x: UInt64) -> UInt64 { x -= 1 return x } postfix func --(inout x: UInt64) -> UInt64 { x -= 1 return (x + 1) } prefix func --(inout x: Double) -> Double { x -= 1 return x } postfix func --(inout x: Double) -> Double { x -= 1 return (x + 1) } prefix func --(inout x: Float) -> Float { x -= 1 return x } postfix func --(inout x: Float) -> Float { x -= 1 return (x + 1) } prefix func --(inout x: Float80) -> Float80 { x -= 1 return x } postfix func --(inout x: Float80) -> Float80 { x -= 1 return (x + 1) } prefix func --<T : BidirectionalIndexType>(inout i: T) -> T { i = i.predecessor() return i } postfix func --<T : BidirectionalIndexType>(inout i: T) -> T { let y = i i = i.predecessor() return y } 

苹果已经删除了++并用另一种传统的方式简化了它。

而不是++ ,你需要写+=

例:

 var x = 1 //Increment x += 1 //Means x = x + 1 

同样,对于递减运算符-- ,您需要编写-=

例:

 var x = 1 //Decrement x -= 1 //Means x = x - 1 

For循环:

增量例子:

代替

 for var index = 0; index < 3; index ++ { print("index is \(index)") } 

你可以写:

 //Example 1 for index in 0..<3 { print("index is \(index)") } //Example 2 for index in 0..<someArray.count { print("index is \(index)") } //Example 3 for index in 0...(someArray.count - 1) { print("index is \(index)") } 

减量例子:

 for var index = 3; index >= 0; --index { print(index) } 

你可以写:

 for index in 3.stride(to: 1, by: -1) { print(index) } //prints 3, 2 for index in 3.stride(through: 1, by: -1) { print(index) } //prints 3, 2, 1 for index in (0 ..< 3).reverse() { print(index) } for index in (0 ... 3).reverse() { print(index) } 

希望这可以帮助!

克里斯·拉特纳(Chris Lattner)已经和++和 – 进行过战争。 他写道:“实际使用这些操作符的结果值的代码往往令代码的读者/维护者迷惑和微妙。 他们鼓励“过于棘手”的代码,这可能是可爱的,但很难理解……虽然Swift有明确的评估顺序,任何依赖于它的代码(如foo(++ a,a ++))将是不受欢迎的,即使它是明确的……这些都不符合“如果我们还没有这些东西,我们会把它们添加到Swift 3”这个标准吗?“”

苹果希望保持清晰,清晰,无混淆和直接的语言。 所以他们不赞成++和 – 关键字。

截图警告

Xcode的Fix-it feature给出了明确的答案。

解决警告

++ increment operatorreplace为老式value += 1 (短操作符)和-- decrement operator value -= 1

从文档 :

Swift中的增量/减量运算符在Swift的开发中很早就被添加了,作为C的结果。这些增加没有太多的考虑,从那以后一直没有被考虑过。 这个文件重新审视了它们,并最终build议我们把它们全部删除,因为它们令人困惑,而且没有承担重量。

这个改变似乎并不坏。 ++我和i ++可以很容易地“阅读”,并不能识别一个错误,特别是对于那些还没有把眼睛掏出来,失去一个女朋友加classdebugging一次或两次的新手。 然而,语言的核心方面的变化实际上是一个问题,将会拖延并可能阻止它的广泛使用。

 // This appears to work, so you don't need a temp var, // you do need to pass something in or have it be a // method on the struct or class. // I probably wouldn't actually write a function // just to increment a given value. // I'd just increment it where I needed too. // Otherwise, you copy a value and return it. func otherNewIncrement(newValue : Int) -> Int { return newValue + 1 } 

对于Swift 4,您可以将++--运算符恢复为Int和其他types的扩展。 这里是一个例子:

 extension Int{ static prefix func ++(x: inout Int) -> Int { x += 1 return x } static postfix func ++(x: inout Int) -> Int { defer {x += 1} return x } static prefix func --(x: inout Int) -> Int { x -= 1 return x } static postfix func --(x: inout Int) -> Int { defer {x -= 1} return x } } 

对于其他types,如UIIntInt8FloatDouble等,其工作原理也是一样的。

您可以将这些扩展名粘贴到根目录中的单个文件中,并且可以在其中的所有其他文件中使用这些扩展名。

我已经注意到了几个我的答案在这里,几乎只要我张贴它就反对票。 我认为这是一个哲学上的分歧,而不是批评我的代码如何工作。 如果你在操场上检查它,它是完美的。

我发表这个答案的原因是因为我不同意使计算机编程语言不必要地彼此不同。

语言之间有很多相似之处,使得他们更容易学习,并从一种语言切换到另一种语言。

开发人员通常使用几种编程语言,而不仅仅是一种。 从一种语言切换到另一种语言是很麻烦的,因为没有任何惯例,也没有跨语言的通用标准化。

我相信只要有必要,语言之间应该有语法上的差异,而不是仅此而已。

 var value : Int = 1 func theOldElegantWay() -> Int{ return value++ } func theNewFashionWay() -> Int{ let temp = value value += 1 return temp } 

这绝对是一个缺点,对吧?