precio - swift sport
Comprobando si un objeto es un tipo dado en Swift (14)
¿Por qué no usar algo como esto?
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
}
en Swift 3.
Tengo una matriz que se compone de AnyObject
. Quiero iterar sobre él y encontrar todos los elementos que son instancias de matriz.
¿Cómo puedo verificar si un objeto es de un tipo dado en Swift?
¿Por qué no usar la funcionalidad incorporada creada especialmente para esta tarea?
let myArray: [Any] = ["easy", "as", "that"]
let type = type(of: myArray)
Result: "Array<Any>"
En Swift 2.2 - 4.0.3 ahora puedes hacer:
if object is String
{
}
Luego para filtrar su matriz:
let filteredArray = originalArray.filter({ $0 is Array })
Se advierte sobre esto:
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)
Las cuatro últimas líneas devuelven verdadero, esto se debe a que si escribe
var r1:CGRect = CGRect()
print(r1 is String)
... se imprime "falso", por supuesto, pero una Advertencia dice que el lanzamiento de CGRect a String falla. Entonces, algunos tipos están puenteados, y la palabra clave ''es'' llama a una conversión implícita.
Deberías usar mejor uno de estos:
myObject.isKind(of: MyClass.self))
myObject.isMember(of: MyClass.self))
Si desea verificar un tipo específico, puede hacer lo siguiente:
if let stringArray = obj as? [String] {
// obj is a string array. Do something with stringArray
}
else {
// obj is not a string array
}
Puedes usar "como!" y eso generará un error de tiempo de ejecución si obj
no es de tipo [String]
let stringArray = obj as! [String]
También puedes marcar un elemento a la vez:
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
}
}
Si no sabe que obtendrá una matriz de diccionarios o un diccionario único en la respuesta del servidor, debe verificar si el resultado contiene una matriz o no.
En mi caso siempre recibo un conjunto de diccionarios excepto una vez. Entonces, para manejar eso usé el siguiente código para swift 3.
if let str = strDict["item"] as? Array<Any>
¿Aquí como? La matriz verifica si el valor obtenido es una matriz (de elementos del diccionario). En caso contrario, puede controlar si es un elemento de diccionario único que no se mantiene dentro de una matriz.
Si solo desea verificar la clase sin recibir una advertencia debido al valor definido no utilizado (deje algo de Variable ...), simplemente puede reemplazar las cosas con un valor booleano:
if (yourObject as? ClassToCompareWith) != nil {
// do what you have to do
}
else {
// do something else
}
Xcode propuso esto cuando usé let way y no usé el valor definido.
Si solo quiere saber si un objeto es un subtipo de un tipo dado, entonces hay un enfoque más simple:
class Shape {}
class Circle : Shape {}
class Rectangle : Shape {}
func area (shape: Shape) -> Double {
if shape is Circle { ... }
else if shape is Rectangle { ... }
}
“Utilice el operador de verificación de tipo (es) para verificar si una instancia es de un determinado tipo de subclase. El operador de verificación de tipo devuelve verdadero si la instancia es de ese tipo de subclase y falso si no lo es ”. Extracto de: Apple Inc.“ El lenguaje de programación Swift ”. iBooks .
En lo anterior, la frase "de un cierto tipo de subclase" es importante. El compilador acepta el uso de is Circle
y is Rectangle
ya que la shape
valor se declara como Shape
(una superclase de Circle
y Rectangle
).
Si está utilizando tipos primitivos, la superclase sería Any
. Aquí hay un ejemplo:
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"
Si tiene una respuesta como esta:
{
"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.com/images/placeholder-profile.png",
"doctor_request_status": 0
},
"max_number_of_confirmation_trials": 4,
"max_number_of_invalid_confirmation_trials": 12
}
y desea verificar el valor is_stucked
que se leerá como AnyObject, todo lo que tiene que hacer es esto
if let isStucked = response["is_stucked"] as? Bool{
if isStucked{
print("is Stucked")
}
else{
print("Not Stucked")
}
}
Suponga que drawTriangle es una instancia de UIView. Para verificar si drawTriangle es del tipo UITableView:
En Swift 3 ,
if drawTriangle is UITableView{
// in deed drawTriangle is UIView
// do something here...
} else{
// do something here...
}
Esto también podría ser usado para clases definidas por ti mismo. Podría usar esto para verificar subvistas de una vista.
Swift 3:
class Shape {}
class Circle : Shape {}
class Rectangle : Shape {}
if aShape.isKind(of: Circle.self) {
}
Tengo 2 formas de hacerlo:
if let thisShape = aShape as? Square
O:
aShape.isKindOfClass(Square)
Aquí hay un ejemplo detallado:
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")
}
Edición: 3 ahora:
let myShape = Shape()
if myShape is Shape {
print("yes it is")
}
myObject as? String
myObject as? String
devuelve nil
si myObject
no es una String
. De lo contrario, devuelve una String?
, para que puedas acceder a la propia cadena con myObject!
, o myObject! as String
con myObject! as String
myObject! as String
segura.
para swift4:
if obj is MyClass{
// then object type is MyClass Type
}