===
是身份的運營商,只能應用於實例類, 它被聲明爲現在
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_
兩個呼叫和demangling此函數名與
xcrun swift-demangle __TFE10FoundationCSo8NSNumberCfMS0_FT14integerLiteralSi_S0_
給出
ext.Foundation.ObjectiveC.NSNumber.init (ObjectiveC.NSNumber.Type)(integerLiteral : Swift.Int) -> ObjectiveC.NSNumber
所以在NSNumber
1 === 1
兩個實例進行比較(這是對象)。
請注意,只有在包含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'
不編譯。
==
,在另一方面,是相等運算和內容其 操作數進行比較。它是爲自選定義如果基礎類型是equatable:
func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool
因此在1 == "1".toInt()
,在LHS被轉換爲Int?
,然後進行比較 與RHS。
'!=='和''===是運營商的身份,爲1視爲一個對象*迅速*? – Maroun 2014-11-25 07:48:34
我不這麼認爲。但是讓我困惑的是,那張圖中的第3行很好,但第1行是錯誤的。當我從操場刪除''1!==「1」.toInt()'''時,一切工作正常。我沒有看到區別。可能我有愚蠢的做法,因爲我是Ruby開發者... – 2014-11-25 07:52:44
我更新了描述以避免這些類型的問題 – 2014-11-25 07:55:29