我有一个愚蠢的问题,我最确定,我做错了什么,但却无法弄清楚它是什么。我有一个简单的游乐场,在那里我玩Swift Operators并且遇到了大概,我有以下代码:
1 != 1 // false
1 !== "1".toInt() //false
1 === 1 // true
1 == "1".toInt() // true
哪个应该完全正常,但是playground编译器显示以下错误:
我做错了什么?这个问题究竟意味着什么?
更新
当我删除第2行时,错误消失: Xcode版本6.1(6A1052d)
更新2
当我比较1 === 1.toInt()
时,我收到了另一个错误:
答案 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 {//做某事}