【问题标题】:list of Swift arithmetic and comparison operator overloads for numbers?数字的 Swift 算术和比较运算符重载列表?
【发布时间】:2014-07-29 16:24:49
【问题描述】:

文档中是否有一个地方或者我可以在 Xcode 6 中动态查找的地方显示所有为数字定义的运算符重载,例如二进制算术和比较运算符?

Swift 支持所有数字类型的四种标准算术运算符:
加法 (+)
减法 (-)
乘法 (*)
除法 (/)

Swift 支持所有标准 C 比较运算符:
等于 (a == b)
不等于 (a != b)
大于 (a > b)
小于 (a 大于或等于 (a >= b)
小于或等于 (a

我想知道的原因是,我可以看到什么时候必须使用类型转换,什么时候不需要,因为有两个兼容类型的内置运算符重载。

我有一个关于类型转换和自动升级的相关问题,但在发布之前,我想确保我理解 Swift 默认定义的规则。

【问题讨论】:

  • 当您在 Swift 类型(例如 Int )上单击命令时,您会看到一个(自动生成的)文件,其中包含所有类型、运算符、构造函数……
  • 我已经看过了,但我没有看到将 Int 添加到 Float 的定义在没有强制转换的情况下是合法的(例如 1 + 0.8),但你必须使用强制转换如果其中一个实际上是变量或常量。

标签: xcode swift operator-overloading


【解决方案1】:

正如 Martin 所说,您可以看到一种头文件,通过命令单击 Int 或其他一些 Swift 类型来声明这些函数。例如乘法函数如下所示:

func *(lhs: UInt8, rhs: UInt8) -> UInt8
func *(lhs: Float, rhs: Float) -> Float
func *(lhs: Int, rhs: Int) -> Int
func *(lhs: UInt, rhs: UInt) -> UInt
func *(lhs: Int64, rhs: Int64) -> Int64
func *(lhs: Float80, rhs: Float80) -> Float80
func *(lhs: Double, rhs: Double) -> Double
func *(lhs: UInt64, rhs: UInt64) -> UInt64
func *(lhs: Int32, rhs: Int32) -> Int32
func *(lhs: UInt32, rhs: UInt32) -> UInt32
func *(lhs: Int16, rhs: Int16) -> Int16
func *(lhs: UInt16, rhs: UInt16) -> UInt16
func *(lhs: Int8, rhs: Int8) -> Int8

所有算术函数都采用两个相同类型的数字并返回该类型的数字。这就是为什么您经常需要在算术运算之前进行转换。

您只需转换已经具有类型的变量或常量。您可以对原始数字文字进行任何算术运算。

在这种情况下,两个操作数都是常量,并且 swift 在定义它们时隐式地给了它们一个类型:

let a = 42 //compiler assumes Int
let b = 3.14 //compiler assumes Float
a + Int(b) //returns Int (45)

但这并不意味着有小数点会强制将文字分配给 Float 变量。您可以显式强制类型:

var x: Int = 1.1 //shows 1
var y: Float = 1 //shows 1.0

这就是为什么你可以做这样的事情:

var foo = 10
foo + 10.4

即使 10.4 是一个浮点字面量,因为 Swift 已经将 foo 隐式键入为一个 Integer,它也将 10.4 字面量视为一个 Integer 并愉快地将它们加在一起。

【讨论】:

  • 谢谢。您的“foo + 10.4”示例引出了我关于类型转换和升级的下一个问题,但我觉得这应该是它自己的问题,而不是关于这个问题的“讨论”。得到 Int 类型的 20 的结果似乎是错误的。如果编译器发出警告,那将是一回事,但简单地截断 10.4 是不好的。
  • 这有点奇怪。 c(可能是大多数受 c 启发的语言)做同样的事情。 int x = 0.9; printf("%d",x); 打印 0
  • 这里也是关于 swift 文本的页面:developer.apple.com/library/prerelease/ios/documentation/Swift/…
  • "Objective C without the C" ...好吧,有点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
相关资源
最近更新 更多