就像java的instanceOf关键字在Swift中的等价物一样?
java示例:
A a = new A();
boolean isInstanceOfA = a instanceof A;
这里isInstanceOfA是真的
所以我在Swift中需要类似的东西
答案 0 :(得分:21)
isKindOfClass()
方法相当于java的instanceof关键字,在java中它是一个关键字,但在swift中它是一种协议方法,但它们的行为相似并且被使用在类似的背景下。
如果接收者是该实例,则
isKindOfClass:
返回YES 指定的类或继承自的类的任何实例 指定的类。
这正是关键字instanceof在Java related link
中的作用示例:
let a: A = A()
let isInstanceOfA: Bool = a.isKindOfClass(A) // returns true.
您还可以使用is
关键字
let a: A = A()
let isInstanceOfA: Bool = a is A
区别:
is
适用于Swift中的任何类,而isKindOfClass()
仅适用于NSObject
的子类或其他实现NSObjectProtocol
的类。
is
采用必须在编译时进行硬编码的类型。 isKindOfClass:
接受一个表达式,其值可以在运行时计算。
所以is
关键字没有像instanceof
答案 1 :(得分:15)
let a = A()
let isInstanceOfA = a is A
答案 2 :(得分:14)
swift3 和 swift4 :
if someInstance is SomeClass {
...
}
如果您的课程正在扩展NSObject
,您还可以使用:
if someInstance.isKind(of: SomeClass.self) {
...
}
答案 3 :(得分:0)
对于 Swift 4.x ,它是:
func getOrElse<T>(defaultVal:T) -> T {
if let selfVal = self, selfVal is T {
return selfVal as! T
} else {
return defaultVal
}
}
非常短的变体(根据建议 @Sulthan ):
extension Optional {
func getOrElse<T>(defaultVal:T) -> T {
return (self as? T) ?? defaultVal
}
}
答案 4 :(得分:-1)
使用objective-c isKindOfClass:[ClassName class]
。
使用swift isKindOfClass(Classname.class())
。