检查对象是否是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 Circle
, is Rectangle
被编译器接受,因为该值的shape
被声明为Shape
( Circle
和Rectangle
的超类)。
如果你正在使用原始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") } }