【问题标题】:What was the reason for Swift assignment evaluation to void?Swift 赋值评估无效的原因是什么?
【发布时间】:2016-03-14 09:18:56
【问题描述】:

这个问题是关于HISTORY(不是你目前对此事的看法)。

在阅读有关放弃对 Swift 的递增/递减运算符的支持的文章时,我读到了这样的文本“Swift 已经偏离了 C,因为 =、+= 和其他类似赋值的操作返回 Void(出于多种原因)”。

所以在过去的某个时候,开发人员出于某些原因有意识地决定评估分配为无效。

我正在寻找那些历史(现在)的原因。几乎就像这个线程是关于Scala 的历史原因一样。

【问题讨论】:

  • 您能否提供有关放弃对增量/减量的支持的文章的链接?我有兴趣阅读它。
  • 在 C 中你可以使用 if i=1 {} 之类的东西。赋值的结果返回您可以使用的值。很快,这样的语句将无法编译,原因(我认为是这样)是为了避免不必要的副作用。我可以同意这个想法,另一方面我真的不明白,为什么要++i,i++。 --i, i-- 应该从语言中删除。我至少读了两遍这篇文章,但对我来说仍然不是很清楚。
  • @user3441734,这可能是原因,但我认为不是。因为在 Swift 中,if 只接受布尔表达式,如果我没记错的话。所以即使i = 1 返回ifif i = 1 {} 也不会编译,因为在Swift 中1 不是布尔值。 @greenoldman,谢谢你的链接)
  • 我不能专门谈论 Swift,但有些人认为使用表达式来表示它的值和副作用是一种不好的做法,因为这样的代码很难理解。它还可能导致像 i = ++i + i++; 这样的代码,在 C 和 C++ 中具有未定义的行为。

标签: swift language-design assignment-operator


【解决方案1】:

至少有一个原因是比较操作更安全。在用 C、Objective-C 等写的时候,你写过多少次了:

if (x = 2)

而不是

if (x == 2)

较新版本的编译器已针对上述情况引入了特定警告,但令人惊讶的是,多年来,缺少一个等号导致我的代码中出现难以识别的错误。

使用 Swift 类型系统,这将不是什么问题,因为返回的值很可能不符合 BooleanType 协议,但如果符合 (if x = false),您可能仍然会遇到这些错误。许多 Swift 旨在消除人们遇到的常见错误原因,包括这个。

这在 Swift 编程语言一书中的"Basic Operators" 下有说明:

与 C 和 Objective-C 中的赋值运算符不同,赋值 Swift 中的运算符本身并不返回值。下列 声明无效:

if x = y {
    // this is not valid, because x = y does not return a value
}

此功能可防止赋值运算符 (=) 被 实际使用等于运算符 (==) 时的意外。经过 使 if x = y 无效,Swift 帮助你避免这些 代码中的错误。

【讨论】:

  • 我这辈子(作为开发人员 30 多年)从未犯过这个错误,但我写了很多 x=y=2 之类的代码。我为别人的错误感到受到惩罚:-)
猜你喜欢
  • 2011-01-01
  • 2011-08-21
  • 2015-10-17
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多