你不應該做的類比較有==
的建議在其他答案之一中,除非你特別想測試被測對象的類型是否應該與期望的類完全匹配,並且不允許它是被測類的子類。
您可以使用實例方法isKindOfClass
來完成此操作,將子類考慮在內。請參閱下面的代碼示例。
注意:你可能會驚訝,這個工作在一個純粹的雨燕類類型,給出一個實例方法具有相同名稱的NSObject
/NSObjectProtocol
存在。它確實在純Swift中工作(如下面的示例代碼所示 - 使用Xcode 7.3,Swift 2.2.1進行測試),但不涉及@objc
類型,只要您導入Foundation。我假定基於此,此實例方法作爲Foundation中的擴展方法添加到所有類類型中。
import Foundation
class A { }
class B { }
class C: B { }
enum ValueTestError: ErrorType {
case UnexpectedClass(AnyClass)
}
func testInputValue(inputObj:AnyObject, isKindOfClass expectedClass:AnyClass) throws {
guard inputObj.isKindOfClass(expectedClass) else {
throw ValueTestError.UnexpectedClass(inputObj.dynamicType)
}
}
let a = A()
let b = B()
let c = C()
do {
try testInputValue(c, isKindOfClass: B.self)
} catch {
print("This does not get printed as c is of type B (C is subclass of B).")
}
do {
try testInputValue(a, isKindOfClass: B.self)
} catch {
print("This gets printed as a is not of type B.")
}
而且,重要的雖然isKindOfClass
可作爲AnyObject實例方法,試圖把它叫做一個任意斯威夫特類類型的對象將只如果你的工作,反對AnyObject(第一投將永遠當然成功)。舉例說明這一點的代碼如下所示,並且在這個問題上還有更多over here。
import Foundation
class A {}
let a = A()
// the following compiles and returns 'true'
(a as AnyObject).isKindOfClass(A.self)
// the following fails to compile with "Value of type 'A' has no member 'isKindOfClass'"
a.isKindOfClass(A.self)
來源
2016-04-25 21:31:10
mz2
不能存儲'Type'的變量,並用它來'TypeCasting',它需要的類,所以你需要用實際的類來代替'expectedClass'說'String' ,'NSObject'等。 – CodetrixStudio
相關:[在Swift中轉換爲元類型類型](http://stackoverflow.com/q/27882049) –