Entrevista: 10 preguntas sobre Swift. Parte 2

Queda cada vez menos tiempo hasta el lanzamiento del curso "iOS Developer" , por lo que hoy continuamos publicando material de la serie "10 preguntas sobre Swift". La primera parte de la cual se puede leer aquí .



¿Explicar los genéricos en Swift?


Los genéricos (plantillas genéricas) le permiten escribir funciones y tipos flexibles y reutilizables que pueden funcionar con cualquier tipo. Puede escribir código que evite la duplicación y exprese su propósito de manera clara y abstracta.

Los tipos Array y Dictionary en Swift son colecciones universales (genéricos).
En el siguiente código, se utiliza una función universal para intercambiar dos valores para una cadena y un entero. Este es un ejemplo de código reutilizable.

func swapTwoValues<T>(_ a: inout T, _ b: inout T) { let temporaryA = a a = b b = temporaryA } var num1 = 4 var num2 = 5 var str1 = “a” var str2 = “b” swapTwoValues(&num1,&num2) swapTwoValues(&str1,&str2) print (“num1:”, num1) //output: 5 print (“num2:”, num2) //output: 4 print (“str1:”, str1) //output: b print (“str2:”, str2) //output: a 

¿Cuáles son los tipos opcionales en swift y cuándo deben usarse?


Opcional (Opcional, "opcional") en Swift es el tipo en el que el valor puede o no ser. Las opciones se indican agregando "?" a cualquier tipo

Opciones para usar el opcional:

  1. Fragmentos de código que pueden fallar (esperaba algo, pero no recibí nada).
  2. Objetos que actualmente están vacíos pero que pueden convertirse en algo más tarde (y viceversa).

Un buen ejemplo de un opcional:

Una propiedad que puede o no estar presente , como un segundo nombre o esposo / esposa en la clase Persona.

Un método que puede devolver un valor o nada , por ejemplo, coincidir en una matriz.

Un método que puede devolver un resultado o un error y no devolver nada , por ejemplo, intenta leer el contenido de un archivo (como resultado de lo cual generalmente se devolverán los datos del archivo), pero el archivo no existe.

Delegue las propiedades que no siempre tienen que establecerse y generalmente se establecen después de la inicialización.

Como enlaces débiles en las clases . Lo que señalan se puede configurar en cero en cualquier momento.

Si necesita una forma de averiguar cuándo se establece el valor (datos aún no cargados> datos) en lugar de utilizar una variable booleana dataLoaded independiente.

¿Qué es el encadenamiento opcional en Swift?


Los procesos de solicitud, invocación de propiedades, subíndices y métodos para un opcional, que puede tener el valor "nulo", se definen como una secuencia opcional (cadena opcional) .

La secuencia opcional devuelve dos valores:
  • si la opción contiene un "valor", cuando se invocan las propiedades, métodos y subíndices asociados, se devuelve el valor
  • si un opcional contiene "nil", todas las propiedades, métodos y subíndices asociados con él devuelven nil

Una secuencia opcional es una alternativa al desempaque forzado.

¿Qué es el desenvolvimiento forzado?


El desempaque forzado es una forma de recuperar el valor contenido en una opción. Esta operación es peligrosa porque básicamente le está diciendo al compilador: estoy seguro de que esta opción contiene un valor real, ¡extráigalo!

 let value: Int? = 1 let newValue: Int = value! //  newValue  1 let anotherOptionalInt: Int? = nil let anotherInt = anotherOptionalInt! // Output:fatal error:  nil    . 

¿Qué es el desenvolvimiento implícito?


Desempaque implícito : cuando definimos una opción desempaquetada implícitamente, definimos un contenedor que forzará automáticamente el desempaque cada vez que lo leamos.

 var name: String! = “Viratlet student = name //       name = nil let player = name //Output:fatal error:  nil    . 

Si la opción implícitamente desempaquetada es nula e intenta acceder a su valor empaquetado, arrojará un error de tiempo de ejecución. El resultado es exactamente el mismo que si colocara un signo de exclamación después del habitual opcional, que no contiene un valor.

¿Qué es la encuadernación opcional?


Puede desempaquetar las opciones de forma "segura" o "insegura". Una forma segura es usar carpetas opcionales.

El enlace opcional se usa para determinar si un opcional contiene un valor y, de ser así, haremos que ese valor esté disponible como una constante o variable de tiempo. Por lo tanto, no hay necesidad de usar un sufijo. para acceder a su valor.

 let possibleString: String? = "Hello" if let actualString = possibleString { //actualString -  ( )   // ,   possibleString print(actualString) } else { //possibleString   ,   // } 

¿Qué es un Guard y cuáles son sus beneficios?


La declaración de guard es simple y poderosa. Comprueba alguna condición y, si se evalúa como falsa, se ejecuta la instrucción else, que generalmente finaliza el método.

 func addStudent(student: [String: String]) { guard let name = student["name"] else { return } print("Added \(name)!") guard let rollNo = student ["rollNo"] else { print("roll No not assigned") return } print("Assigned roll no is \(rollNo).") } addStudent(student: ["name": "Ravi"]) //  "Added Ravi!" //  "roll No not assigned" addStudent(student: ["name": "Ravi", "rollNo": "1"]) //  "Added Ravi!" //  "Assigned roll no is 1" 

La ventaja de la guard es una ejecución más rápida . Guard bloqueo Guard se ejecuta solo si la condición es falsa y se saldrá del bloque a través de una declaración de transferencia de control como return , break , continue o thrown . Esto proporciona una salida anticipada y menos paréntesis. La salida anticipada significa una ejecución más rápida.

Consulte este artículo para obtener más información.

¿Cuándo se debe usar guard let y cuándo se debe if let ?

  • Use la guard cuando desee eliminar entradas inesperadas / incorrectas y concéntrese en el objetivo si tiene formas alternativas de manejar las entradas.
  • Use el bloque guard if else para reducir el anidamiento y la sangría, ya que es relativamente compacto.

¿Qué es defer ?


La defer usa para ejecutar un conjunto de declaraciones justo antes de que la ejecución del código abandone el bloque actual.

La defer dentro del bloque if se ejecutará primero. Esto es seguido por el patrón LIFO para ejecutar las declaraciones de defer restantes.

 func doSomething() { defer { print(“1”)} defer { print(“2”)} defer { print(“3”)} if 1<2 { defer { print("1<2")} } defer { print(“4”)} defer { print(“5”)} defer { print(“6”)} }  1<2 6 5 4 3 2 1 

¿Enumerar qué operadores de transferencia de control se utilizan en Swift?


break : la instrucción break finaliza la ejecución de la declaración de flujo de control completo de inmediato.

continue : la instrucción continue le dice al ciclo que pare lo que está haciendo y que comience nuevamente al comienzo de la siguiente iteración del ciclo.
return : devuelve valores de funciones.
throw - necesita reenvío de error usando funciones de lanzamiento
fallthrough : la declaración fallthrough utiliza en el bloque de mayúsculas y minúsculas para ejecutar la declaración de caso, que se encuentra junto a las declaraciones de caso correspondientes según los requisitos del usuario.

En fallthrough swift el operador de fallthrough utiliza para ejecutar el siguiente caso, incluso si no coincide con el original.

 let integerToDescribe = 5 var description = “The number \(integerToDescribe) isswitch integerToDescribe { case 2, 3, 5, 7, 11, 13, 17, 19: description += “ a prime number, and also” fallthrough case 10: description += “ case 10.” default: description += “ an integer.” } print(description)// :The number 5 is a prime number, and also case 10. 

El final de la segunda parte. La primera parte se puede leer aquí .

Estamos a la espera de sus comentarios y recordamos que dentro de unas horas habrá una jornada de puertas abiertas , en cuyo marco hablaremos en detalle sobre nuestro curso.

Source: https://habr.com/ru/post/452806/


All Articles