检查对象是否是Swift中给定的types

我有一个由AnyObject组成的AnyObject 。 我想遍历它,并find所有的元素是数组实例。

我如何检查一个对象是否是Swift中给定的types?

如果你想检查一个特定的types,你可以执行以下操作:

 if let stringArray = obj as? [String] { // obj is a string array. Do something with stringArray } else { // obj is not a string array } 

你可以使用“as!” 如果obj不是[String]types,则会引发运行时错误

 let stringArray = obj as! [String] 

您也可以一次检查一个元素:

 let items : [Any] = ["Hello", "World"] for obj in items { if let str = obj as? String { // obj is a String. Do something with str } else { // obj is not a String } } 

如果你只想知道一个对象一个给定types的子types,那么有一个更简单的方法:

 class Shape {} class Circle : Shape {} class Rectangle : Shape {} func area (shape: Shape) -> Double { if shape is Circle { ... } else if shape is Rectangle { ... } } 

“使用types检查运算符(是)来检查实例是否具有某种子types。 如果实例是该子类的types,则返回true;如果不是,则返回false。“摘自:Apple Inc.”Swift编程语言“ iBooks 。

在上面,“某个子types”这个短语很重要。 使用的is Circleis Rectangle被编译器接受,因为该值的shape被声明为ShapeCircleRectangle的超类)。

如果你正在使用原始types,超类将是Any 。 这里是一个例子:

  21> func test (obj:Any) -> String { 22. if obj is Int { return "Int" } 23. else if obj is String { return "String" } 24. else { return "Any" } 25. } ... 30> test (1) $R16: String = "Int" 31> test ("abc") $R17: String = "String" 32> test (nil) $R18: String = "Any" 

在Swift 2.2 – 3.0.1中你现在可以做到:

 if object is String { } 

然后过滤你的数组:

 let filteredArray = originalArray.filter({ $0 is Array }) 

我有两种方法来做到这一点:

 if let thisShape = aShape as? Square 

要么:

 aShape.isKindOfClass(Square) 

这里有一个详细的例子:

 class Shape { } class Square: Shape { } class Circle: Shape { } var aShape = Shape() aShape = Square() if let thisShape = aShape as? Square { println("Its a square") } else { println("Its not a square") } if aShape.isKindOfClass(Square) { println("Its a square") } else { println("Its not a square") } 

编辑:3现在:

 let myShape = Shape() if myShape is Shape { print("yes it is") } 

假设drawTriangle是UIView的一个实例。要检查drawTriangle是否是UITableView的types:

Swift 3中

 if drawTriangle is UITableView{ // in deed drawTriangle is UIView // do something here... } else{ // do something here... } 

这也可以用于你自己定义的类。 你可以用它来检查视图的子视图。

为什么不使用专为此任务构build的内置function?

 let myArray: [Any] = ["easy", "as", "that"] let type = type(of: myArray) Result: "Array<Any>" 

如果你只是想检查这个类而不会因为没有使用的定义值(let someVariable …)而得到一个警告,那么你可以简单地用一个布尔值replacelet的东西:

 if (yourObject as? ClassToCompareWith) != nil { // do what you have to do } else { // do something else } 

当我使用let方式并没有使用定义的值时,Xcode提出了这个问题。

被警告这个:

 var string = "Hello" as NSString var obj1:AnyObject = string var obj2:NSObject = string print(obj1 is NSString) print(obj2 is NSString) print(obj1 is String) print(obj2 is String) 

所有的最后四行都返回true,这是因为如果你input

 var r1:CGRect = CGRect() print(r1 is String) 

…它打印“假”,当然,但一个警告说,从CGRect转换为string失败。 所以有些types被桥接,并且“is”关键字调用隐式转换。

你应该更好地使用其中的一个:

 myObject.isKind(of: MyClass.self)) myObject.isMember(of: MyClass.self)) 

为什么不使用这样的东西

 fileprivate enum types { case typeString case typeInt case typeDouble case typeUnknown } fileprivate func typeOfAny(variable: Any) -> types { if variable is String {return types.typeString} if variable is Int {return types.typeInt} if variable is Double {return types.typeDouble} return types.typeUnknown } 

在Swift 3。

myObject as? String 如果myObject不是myObject as? String返回nil 。 否则,它返回一个String? ,所以你可以用myObject!访问string本身myObject! ,或者用myObject! as String myObject! as String安全。

Swift 3:

 class Shape {} class Circle : Shape {} class Rectangle : Shape {} if aShape.isKind(of: Circle.self) { } 

为swift4

 if obj is MyClass{ // then object type is MyClass Type } 

如果你有这样的回应:

 { "registeration_method": "email", "is_stucked": true, "individual": { "id": 24099, "first_name": "ahmad", "last_name": "zozoz", "email": null, "mobile_number": null, "confirmed": false, "avatar": "http://abc-abc-xyz.amazonaws.comhttp://img.dovov.complaceholder-profile.png", "doctor_request_status": 0 }, "max_number_of_confirmation_trials": 4, "max_number_of_invalid_confirmation_trials": 12 } 

而你想检查is_stucked值,它将被读作AnyObject,你所要做的就是这个

 if let isStucked = response["is_stucked"] as? Bool{ if isStucked{ print("is Stucked") } else{ print("Not Stucked") } }