2015-07-05 70 views
2

下列表達式之間是否有區別?Swift is和isKindOfClass()之間的區別?

if someInstance is SomeClass { 
} 

if someInstance.isKindOfClass(SomeClass) { 
} 
+3

前者適用於任何Swift類型。後者要求'someInstance'響應'isKindOfClass'方法(通常通過使它成爲一個NSObject子類來實現)。 – Rob

+2

你可以看看API文檔。 – NSDeveloper

回答

5

我會假設.isKindOfClass()是從可可實例方法。

  • is右側可以是任何類型或協議,而的.isKindOfClass()參數必須是引用類型(即類)。您也可以使用.conformsToProtocol()而不是.isKindOfClass()以相同方式測試是否符合@objc協議。
  • is的左側是任何表達式,而.isKindOfClass()的接收器必須是對象引用。如果表達式的編譯時間類不知道支持.isKindOfClass(),編譯器會發出抱怨,但是您可以通過將左側轉換爲AnyObject來解決此問題。所有Swift類在運行時實際上都支持.isKindOfClass()
  • is的右側是一個必須在編譯時進行硬編碼的類型。 .isKindOfClass()的參數可以是一個變量或其他表達式,其值是在運行時計算的。
+0

「一個必須被硬編碼的類型」是的 - 你可以用'==='來解決這個問題,但是這與'is'不一樣,我還沒有找到一種方法來獲得與'is '當右邊的內容是對一個類的引用時。 – matt

+0

@matt:「我沒有找到一種方法來獲得相同的功能,當右邊的內容是對類的引用時。」 '.isKindOfClass()'不是那麼做的嗎? – newacct

+0

我的意思是一個迅速的方式。並非一切都是可可。並非一切都是一堂課。並非一切都從NSObject繼承。 – matt