Swift运算符== vs ===

时间:2014-11-25 07:46:17

标签: swift operators swift-playground

我有一个愚蠢的问题,我最确定,我做错了什么,但却无法弄清楚它是什么。我有一个简单的游乐场,在那里我玩Swift Operators并且遇到了大概,我有以下代码:

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

哪个应该完全正常,但是playground编译器显示以下错误: enter image description here

我做错了什么?这个问题究竟意味着什么?


更新

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


更新2

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

3 个答案:

答案 0 :(得分:4)

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

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

现在1 === 1有效,因为编译器在这里创建了NSNumber个实例 自动。 NSNumber符合IntegerLiteralConvertible 协议:

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'

无法编译。


另一方面,

==等于运算符并比较其内容 操作数。如果底层类型是等同的,则为optionals定义:

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

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

答案 1 :(得分:0)

  

请注意,我从未编程甚至没有听说过Swift,而是来自   我发现的文档和C#的经验,我试着给出一个   答案我认为是正确的。如果没有,我会删除答案。

Swift似乎(如C#)“optional types”,在类型标识符之后用问号表示,如下所示:int?toInt()似乎return an "optional int",与int不同(如错误所示)。

要将该可选int设为“normal”int,请使用感叹号:

1 == "1".toInt()!

答案 2 :(得分:0)

&#34; ===&#34; operator是测试两个对象引用是否都引用同一个对象实例

在其他语言中,我知道它用于测试它是否是相同的类型和值。

但是当代码期望整数文字时,你在字符串文字上调用了to.Int()函数。

我这样做:

让a =&#34; 1&#34 ;; 设b = a.toInt()

如果1!== b {//做某事}