什么相当于Swift中java的instanceof?

时间:2016-06-01 08:28:38

标签: ios swift

就像java的instanceOf关键字在Swift中的等价物一样?

java示例:

A a = new A();
boolean isInstanceOfA = a instanceof A;

这里isInstanceOfA是真的

所以我在Swift中需要类似的东西

5 个答案:

答案 0 :(得分:21)

来自NSObjectProtocol的

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)

使用 isKindOfClass:[ClassName class]

使用 isKindOfClass(Classname.class())