English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Conversión de tipos en Swift

La conversión de tipo en Swift puede determinar el tipo de ejemplo. También se puede usar para verificar si el tipo de ejemplo pertenece a un ejemplo de la clase padre o subclase.

La conversión de tipo en Swift se realiza mediante los operadores is y as, is se utiliza para detectar el tipo de valor, as se utiliza para convertir el tipo.

La conversión de tipo también se puede usar para verificar si una clase ha implementado un protocolo.

Definir una jerarquía de clases

A continuación se definen tres clases: Subjects, Chemistry, Maths, Chemistry y Maths heredan de Subjects.

El código es el siguiente:

class Subjects {
    var physics: String
    init(física: String) {
        self.physics = physics
    }
}
class Chemistry: Subjects {
    var equations: String
    init(física: String, equations: String) {
        self.equations = equations
        super.init(física: physics)
    }
}
class Maths: Subjects {
    var formulae: String
    init(física: String, formulae: String) {
        self.formulae = formulae
        super.init(física: physics)
    }
}
let sa = [
    Química(física: "Física de sólidos", ecuaciones: "Hercios"),
    Maths(physics: "Dinámica de fluidos", formulae: "Gigahercios")
let samplechem = Química(física: "Física de sólidos", ecuaciones: "Hz")
imprime("La física del ejemplo es: \(samplechem.physics)")
imprime("Ejemplo de ecuación: \(samplechem.ecuaciones)")
let samplemaths = Matemáticas(física: "Dinámica de fluidos", fórmulas: "PetaHz")
imprime("La física del ejemplo es: \(samplemaths.physics)")
imprime("La fórmula de ejemplo es: \(samplemaths.formulae)")

El resultado de la ejecución del programa es:

El ejemplo de física es: Física de sólidos
El ejemplo de ecuación es: Hz
El ejemplo de física es: Dinámica de fluidos
La fórmula de ejemplo es: GHz

Verificar tipo

La conversión de tipo se utiliza para detectar si el tipo de ejemplo pertenece a un tipo de ejemplo específico.

Puedes usarlo en la jerarquía de clases y subclases, para verificar el tipo de ejemplo de una clase específica y convertir el ejemplo de clase en otro tipo de la jerarquía.

La comprobación de tipo de tipo se utiliza es palabra clave.

operador es Para verificar si un ejemplo pertenece a un subtipo específico. Si el ejemplo pertenece a ese subtipo, el operador de comprobación de tipo devuelve true, de lo contrario devuelve false.

class Subjects {
    var physics: String
    init(física: String) {
        self.physics = physics
    }
}
class Chemistry: Subjects {
    var equations: String
    init(física: String, equations: String) {
        self.equations = equations
        super.init(física: physics)
    }
}
class Maths: Subjects {
    var formulae: String
    init(física: String, formulae: String) {
        self.formulae = formulae
        super.init(física: physics)
    }
}
let sa = [
    Química(física: "Física de sólidos", ecuaciones: "Hercios"),
    Matemáticas(física: "Dinámica de fluidos", ecuaciones: "Gigahercios"),
    Química(física: "Termodinámica", ecuaciones: "Decibelios"),
    Matemáticas(física: "Física celeste", fórmulas: "TeraHz"),
    Matemáticas(física: "Ecuaciones diferenciales", fórmulas: "Seno armónico")
let samplechem = Química(física: "Física de sólidos", ecuaciones: "Hz")
imprime("La física del ejemplo es: \(samplechem.physics)")
imprime("Ejemplo de ecuación: \(samplechem.ecuaciones)")
let samplemaths = Matemáticas(física: "Dinámica de fluidos", fórmulas: "PetaHz")
imprime("La física del ejemplo es: \(samplemaths.physics)")
imprime("La fórmula de ejemplo es: \(samplemaths.formulae)")
var chemCount = 0
var mathsCount = 0
for item in sa {
    // Si el ejemplo es de tipo Chemistry, devuelve true, de lo contrario devuelve false.
    if item is Chemistry {
        ++chemCount
    } else if item is Maths {
        ++mathsCount
    }
}
print("La materia química contiene \(chemCount) temas, matemáticas contiene \(mathsCount) temas")

El resultado de la ejecución del programa es:

El ejemplo de física es: Física de sólidos
El ejemplo de ecuación es: Hz
El ejemplo de física es: Dinámica de fluidos
La fórmula de ejemplo es: GHz
las materias de química incluyen 2 de temas, matemáticas incluye 3 de temas

Transición hacia abajo

Transición hacia abajo, usando el operador de conversión de tipo (as? o as!)

Cuando no estés seguro de que la transición hacia abajo pueda tener éxito, usa la conversión de tipo condicional (as?). La conversión de tipo condicional siempre devuelve un valor opcional (opcional value), y si la transición no es posible, el valor opcional será nil.

Sólo se debe usar la conversión forzada (as!) cuando puedas estar seguro de que la transición hacia abajo siempre tendrá éxito. Cuando intentas hacer una transición hacia un tipo incorrecto, la conversión forzada de tipo desencadenará un error en tiempo de ejecución.

class Subjects {
    var physics: String
    init(física: String) {
        self.physics = physics
    }
}
class Chemistry: Subjects {
    var equations: String
    init(física: String, equations: String) {
        self.equations = equations
        super.init(física: physics)
    }
}
class Maths: Subjects {
    var formulae: String
    init(física: String, formulae: String) {
        self.formulae = formulae
        super.init(física: physics)
    }
}
let sa = [
    Química(física: "Física de sólidos", ecuaciones: "Hercios"),
    Matemáticas(física: "Dinámica de fluidos", ecuaciones: "Gigahercios"),
    Química(física: "Termodinámica", ecuaciones: "Decibelios"),
    Matemáticas(física: "Física celeste", fórmulas: "TeraHz"),
    Matemáticas(física: "Ecuaciones diferenciales", fórmulas: "Seno armónico")
let samplechem = Química(física: "Física de sólidos", ecuaciones: "Hz")
imprime("La física del ejemplo es: \(samplechem.physics)")
imprime("Ejemplo de ecuación: \(samplechem.ecuaciones)")
let samplemaths = Matemáticas(física: "Dinámica de fluidos", fórmulas: "PetaHz")
imprime("La física del ejemplo es: \(samplemaths.physics)")
imprime("La fórmula de ejemplo es: \(samplemaths.formulae)")
var chemCount = 0
var mathsCount = 0
for item in sa {
    // forma condicional de conversión de tipo
    if let show = item como? Química {
        imprime("El tema químico es: '\(show.physics)', \(show.ecuaciones)")
        // forma obligatoria
    } else if let example = item como? Matemáticas {
        imprime("El tema matemático es: '\(example.physics)', \(example.formulae)")
    }
}

El resultado de la ejecución del programa es:

El ejemplo de física es: Física de sólidos
El ejemplo de ecuación es: Hz
El ejemplo de física es: Dinámica de fluidos
La fórmula de ejemplo es: GHz
El tema químico es: 'Física de sólidos', Hz
El tema matemático es: 'Dinámica de fluidos', GHz
El tema químico es: 'Física térmica', dB
El tema químico es: 'Física de sólidos', MHz
El tema matemático es: 'Ecuaciones diferenciales', serie de cosenos

Conversión de tipos de Any y AnyObject

Swift proporciona dos alias de tipo especiales para tipos indeterminados:

  • AnyObjectpuede representar cualquier ejemplo de tipo class.
  • Anypuede representar cualquier tipo, incluyendo tipos de métodos (function types).

Nota:
sólo se deben usar cuando necesites explicitamente su comportamiento y funcionalidadAnyyAnyObjectEn tu código, siempre es mejor usar tipos explícitos que esperas.

Ejemplo de Any

class Subjects {
    var physics: String
    init(física: String) {
        self.physics = physics
    }
}
class Chemistry: Subjects {
    var equations: String
    init(física: String, equations: String) {
        self.equations = equations
        super.init(física: physics)
    }
}
class Maths: Subjects {
    var formulae: String
    init(física: String, formulae: String) {
        self.formulae = formulae
        super.init(física: physics)
    }
}
let sa = [
    Química(física: "Física de sólidos", ecuaciones: "Hercios"),
    Matemáticas(física: "Dinámica de fluidos", ecuaciones: "Gigahercios"),
    Química(física: "Termodinámica", ecuaciones: "Decibelios"),
    Matemáticas(física: "Física celeste", fórmulas: "TeraHz"),
    Matemáticas(física: "Ecuaciones diferenciales", fórmulas: "Seno armónico")
let samplechem = Química(física: "Física de sólidos", ecuaciones: "Hz")
imprime("La física del ejemplo es: \(samplechem.physics)")
imprime("Ejemplo de ecuación: \(samplechem.ecuaciones)")
let samplemaths = Matemáticas(física: "Dinámica de fluidos", fórmulas: "PetaHz")
imprime("La física del ejemplo es: \(samplemaths.physics)")
imprime("La fórmula de ejemplo es: \(samplemaths.formulae)")
var chemCount = 0
var mathsCount = 0
for item in sa {
    // forma condicional de conversión de tipo
    if let show = item como? Química {
        imprime("El tema químico es: '\(show.physics)', \(show.ecuaciones)")
        // forma obligatoria
    } else if let example = item como? Matemáticas {
        imprime("El tema matemático es: '\(example.physics)', \(example.formulae)")
    }
}
// puede almacenar un arreglo de tipos Any
var exampleany = [Any]()
exampleany.append(12)
exampleany.append(3.14159)
exampleany.append("Cualquier ejemplo")
exampleany.append(Química(física: "Física de sólidos", ecuaciones: "TeraHz"))
for item2 en exampleany {
    switch item2 {
    caso let someInt como Int:
        imprime("El valor entero es \(someInt)")
    caso let someDouble como Double donde someDouble > 0:
        imprime("El valor de Pi es \(someDouble)")
    caso let someString como String:
        print("\(someString)")
    case let phy as Chemistry:
        print("Tema '\(phy.physics)', \(phy.equations)")
    default:
        print("None")
    }
}

El resultado de la ejecución del programa es:

El ejemplo de física es: Física de sólidos
El ejemplo de ecuación es: Hz
El ejemplo de física es: Dinámica de fluidos
La fórmula de ejemplo es: GHz
El tema químico es: 'Física de sólidos', Hz
El tema matemático es: 'Dinámica de fluidos', GHz
El tema químico es: 'Física térmica', dB
El tema químico es: 'Física de sólidos', MHz
El tema matemático es: 'Ecuaciones diferenciales', serie de cosenos
El valor entero es 12
El valor de Pi es 3.14159
Ejemplo de Any
Tema 'Física de sólidos', MHz

Ejemplo de AnyObject

class Subjects {
    var physics: String
    init(física: String) {
        self.physics = physics
    }
}
class Chemistry: Subjects {
    var equations: String
    init(física: String, equations: String) {
        self.equations = equations
        super.init(física: physics)
    }
}
class Maths: Subjects {
    var formulae: String
    init(física: String, formulae: String) {
        self.formulae = formulae
        super.init(física: physics)
    }
}
// arreglo de tipos AnyObject
let saprint: [AnyObject] = [
    Química(física: "Física de sólidos", ecuaciones: "Hercios"),
    Matemáticas(física: "Dinámica de fluidos", ecuaciones: "Gigahercios"),
    Química(física: "Termodinámica", ecuaciones: "Decibelios"),
    Matemáticas(física: "Física celeste", fórmulas: "TeraHz"),
    Matemáticas(física: "Ecuaciones diferenciales", fórmulas: "Seno armónico")
let samplechem = Química(física: "Física de sólidos", ecuaciones: "Hz")
imprime("La física del ejemplo es: \(samplechem.physics)")
imprime("Ejemplo de ecuación: \(samplechem.ecuaciones)")
let samplemaths = Matemáticas(física: "Dinámica de fluidos", fórmulas: "PetaHz")
imprime("La física del ejemplo es: \(samplemaths.physics)")
imprime("La fórmula de ejemplo es: \(samplemaths.formulae)")
var chemCount = 0
var mathsCount = 0
for item in saprint {
    // forma condicional de conversión de tipo
    if let show = item como? Química {
        imprime("El tema químico es: '\(show.physics)', \(show.ecuaciones)")
        // forma obligatoria
    } else if let example = item como? Matemáticas {
        imprime("El tema matemático es: '\(example.physics)', \(example.formulae)")
    }
}
var exampleany = [Any]()
exampleany.append(12)
exampleany.append(3.14159)
exampleany.append("Cualquier ejemplo")
exampleany.append(Química(física: "Física de sólidos", ecuaciones: "TeraHz"))
for item2 en exampleany {
    switch item2 {
    caso let someInt como Int:
        imprime("El valor entero es \(someInt)")
    caso let someDouble como Double donde someDouble > 0:
        imprime("El valor de Pi es \(someDouble)")
    caso let someString como String:
        print("\(someString)")
    case let phy as Chemistry:
        print("Tema '\(phy.physics)', \(phy.equations)")
    default:
        print("None")
    }
}

El resultado de la ejecución del programa es:

El ejemplo de física es: Física de sólidos
El ejemplo de ecuación es: Hz
El ejemplo de física es: Dinámica de fluidos
La fórmula de ejemplo es: GHz
El tema químico es: 'Física de sólidos', Hz
El tema matemático es: 'Dinámica de fluidos', GHz
El tema químico es: 'Física térmica', dB
El tema químico es: 'Física de sólidos', MHz
El tema matemático es: 'Ecuaciones diferenciales', serie de cosenos
El valor entero es 12
El valor de Pi es 3.14159
Ejemplo de Any
Tema 'Física de sólidos', MHz

En un caso de una instrucción switch se utiliza el operador de conversión de tipo forzado (as, en lugar de as?) para verificar y convertir a un tipo explícito.