gpt4 book ai didi

Swift 运算符 == 与 ===

转载 作者:搜寻专家 更新时间:2023-11-01 06:24:04 25 4
gpt4 key购买 nike

我有一个愚蠢的问题,我很确定,我做错了什么,但无法弄清楚它是什么。我有一个简单的 Playground ,我在那里玩 Swift 运算符并出现在案例中,我有以下代码:

1 != 1 // false
1 !== "1".toInt() //false
1 === 1 // true
1 == "1".toInt() // true

应该没问题,但是 playground 编译器显示以下错误: enter image description here

我做错了什么?这个问题到底是什么意思?


更新

当我删除第 2 行时,错误消失了: enter image description hereXcode 版本 6.1 (6A1052d)


更新 2

当我比较 1 === 1.toInt() 时,我得到了另一个错误: enter image description here

最佳答案

=== 是身份运算符,只能应用于的实例,它被声明为

func ===(lhs: AnyObject?, rhs: AnyObject?) -> Bool

现在 1 === 1 可以工作了,因为编译器在这里创建了 NSNumber 实例自动地。 NSNumber 符合 IntegerLiteralConvertible协议(protocol):

extension NSNumber : FloatLiteralConvertible, IntegerLiteralConvertible, BooleanLiteralConvertible {

/// Create an instance initialized to `value`.
required convenience init(integerLiteral value: Int)

/// Create an instance initialized to `value`.
required convenience init(floatLiteral value: Double)

/// Create an instance initialized to `value`.
required convenience init(booleanLiteral value: Bool)
}

这一点从用生成的汇编代码也可以看出

xcrun -sdk macosx swiftc -emit-assembly main.swift

显示了两次调用

callq   __TFE10FoundationCSo8NSNumberCfMS0_FT14integerLiteralSi_S0_

并用

分解这个函数名
xcrun  swift-demangle __TFE10FoundationCSo8NSNumberCfMS0_FT14integerLiteralSi_S0_

给予

ext.Foundation.ObjectiveC.NSNumber.init (ObjectiveC.NSNumber.Type)(integerLiteral : Swift.Int) -> ObjectiveC.NSNumber

所以在 1 === 1 中比较 NSNumber 的两个实例(它们是对象)。

请注意,这仅在包含 Foundation 框架时有效(即 NSNumber可用)。否则 1 === 1 无法通过

编译
type 'AnyObject?' does not conform to protocol 'IntegerLiteralConvertible'

两者

1 !== "1".toInt()   // value of optional type 'Int?' not unwrapped
1 !== "1".toInt()! // type 'AnyObject?' does not conform to protocol 'IntegerLiteralConvertible'

不要编译,因为右边不是一个对象,也不是一个字面量编译器自动转换为一个对象。出于同样的原因,

let i = 1
1 !== i // type 'Int' does not conform to protocol 'AnyObject'

不编译。


另一方面,

==相等运算符,比较其内容操作数。如果基础类型是可等式的,它是为可选类型定义的:

func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool

因此在1 == "1".toInt()中,将lhs转换为Int?,然后进行比较用右手。

关于Swift 运算符 == 与 ===,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27121198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com