Domina los inicializadores en Swift con buenas prácticas de nombres, etiquetas de parámetros y manejo de opcionales. Verás cómo crear varios inicializadores en una misma estructura, cuándo omitir etiquetas con subrayado para una sintaxis más legible y qué propiedades debes inicializar siempre en una clase. Todo con ejemplos simples y directos.
¿Cómo crear y sobrecargar inicializadores en Swift?
Definir varios inicializadores permite construir un mismo tipo de diferentes formas. En una estructura de color, las componentes rojo, verde y azul se representan como valores de tipo Double. Si los parámetros de init se llaman igual que las propiedades, usa self. para asignar correctamente.
structColor{var red:Doublevar green:Doublevar blue:Doubleinit(red:Double, green:Double, blue:Double){self.red = red
self.green = green
self.blue = blue
}// Escala de grises: las tres componentes comparten el mismo valor.init(white:Double){self.red = white
self.green = white
self.blue = white
}}// Ejemplos de usolet magenta =Color(red:1, green:0, blue:3)let halfGray =Color(white:0.5)
Puedes definir múltiples inicializadores con diferentes firmas.
Cuando coinciden nombres, usa self.propiedad = parámetro.
Escala de grises: un único parámetro se propaga a las tres componentes.
Llamadas explícitas: usa etiquetas de argumento como red:, green:, blue:.
¿Por qué las etiquetas de parámetros son obligatorias en struct?
En Swift, las estructuras generan inicializadores con etiquetas externas por defecto. Al invocar, debes incluirlas; omitirlas provoca error. Es una ayuda de legibilidad y claridad.
// Error: faltan etiquetas externasauto let c =Color(1,0,1)// ❌// Correcto: con etiquetaslet c =Color(red:1, green:0, blue:1)// ✅
¿Cuándo omitir una etiqueta con subrayado en init?
Hay parámetros cuyo nombre se sobreentiende por el contexto. En un tipo Celsius, escribir la etiqueta externa "celsius" al invocar puede resultar redundante. Para lograr una lectura natural, usa el subrayado en la etiqueta externa del init.
Lectura fluida: cuando el contexto es claro, omite la etiqueta externa.
Sintaxis: declara el init con "_" como etiqueta externa.
Invocación: pasa solo el valor, sin nombre de parámetro.
¿Cómo manejar propiedades opcionales y requeridas en una clase?
Las propiedades no opcionales deben quedar inicializadas al final del init. Las opcionales pueden empezar sin valor. En una pregunta de encuesta, el texto es obligatorio, la respuesta puede ser String?. Además, si el texto no cambia, declara la propiedad como constante con let.
classSurveyQuestion{let text:Stringvar response:String?init(text:String){self.text = text
}funcask(){print(text)}}let q1 =SurveyQuestion(text:"¿Te gustan los tacos?")q1.ask()// Muestra la pregunta.q1.response ="Sí, me encantan todos ellos"// Se asigna después.
Propiedades requeridas: deben inicializarse siempre en el init.
Propiedades opcionales: pueden permanecer sin valor hasta más tarde.
Inmutabilidad útil: usa let cuando el valor no cambia.
Flujo natural: primero se formula la pregunta, luego llega la respuesta.
¿Tú cómo eliges las etiquetas de parámetros en tus inits? Comparte en comentarios tus ejemplos de inicializadores, usos de subrayado y manejo de opcionales en Swift.
classWillSurvey:SurveyQuestion{varresposeTrueOrFalse:Bool?}let q2 =WillSurvey("Te gusta Platzi")q2.ask()q2.resposeTrueOrFalse=truelet q3 =WillSurvey("De que país eres")q2.ask()q2.response="Ecuador"
Imprime las respuestas después de preguntar por ellas, evitando el error de nil 😃
classSurveyQuestions{letQ1:StringvarR1:String?letQ2:StringvarR2:String?letQ3:StringvarR3:String?letQ4:StringvarR4:String?init(q1:String,q2:String,q3:String,q4:String){ self.Q1= q1
self.Q2= q2
self.Q3= q3
self.Q4= q4
} func ask1(){print(Q1)} func ask2(){print(Q2)} func ask3(){print(Q3)} func ask4(){print(Q4)} func res1(){if self.R1!= nil{print(R1!,"\n")}else{print("No hubo respuesta :( \n")}} func res2(){if self.R2!= nil{print(R2!,"\n")}else{print("No hubo respuesta :( \n ")}} func res3(){if self.R3!= nil{print(R3!,"\n")}else{print("No hubo respuesta :( \n")}} func res4(){if self.R4!= nil{print(R4!,"\n")}else{print("No hubo respuesta :( \n")}}}var preguntas =SurveyQuestions(q1:"¿Como te llamas guap@?",q2:"No respondas nada, es para probar el nil ",q3:"¿Quien te gustaria ser en 5 años?",q4:"¿Quienes son tus instructores favoritos?")preguntas.ask1()preguntas.R1="Cedric"preguntas.res1()preguntas.ask2()preguntas.R2preguntas.res2()preguntas.ask3()preguntas.R3="Alguien que se esfuerza por cumplir sus sueños y no deja de aprender "preguntas.res3()preguntas.ask4()preguntas.R4="Freddy Vega y Juan Gomila"preguntas.res4()
++CONSOLA :++
¿Como te llamas guap@?
Cedric
No respondas nada, es para probar el nil
No hubo respuesta :(
¿Quien te gustaria ser en 5 años?
Alguien que se esfuerza por cumplir sus sueños y no deja de aprender
¿Quienes son tus instructores favoritos?
Freddy Vega y Juan Gomila
classSurvey{letquestion:Stringvaranswer:String?init(question:String){ self.question= question
} func ask(){print(question)}}let question1 =Survey(question:"¿Cual es tu edad?")let question2 =Survey(question:"¿Cual es tu curso favorito en Platzi?")let question3 =Survey(question:"¿Cual es tu instructor favorito de Platzi?")question1.ask()question2.ask()question3.ask()question1.answer=" Tengo 32 años"question2.answer=" Mi curso favorito es Introduccion a la programacion en Swift"question3.answer=" Mi instructor favorito es Juan Gabriel Gomila"```
Estoy perdidisimo. Esto no se parece a ningún otro lenguaje que haya aprendido antes, mi pregunta es ¿Struct Color let... con el init abajo seria como un método constructor? Y el self seria como el this. ¿Correcto?
Nunca te respondieron amigo, pero init se refiere al metodo constructor (inicializador seria, que basicamente es la misma funcion), y el self, excactamente seria lo mismo que this en otros lenguajes! un abrazo! (aunque seguramente llego muy tarde esta respuesta jaja).
Mi algoritmoclass SurveyPlatzi {
class SurveyPlatzi {
let text : String
var responseText : String?
var responseInt : Int?
init(text: String){
self.text = text
}
func ask(){
print(text)
}
func printReponse(){
var response : String?
if (responseText != nil){
response = responseText
} else if(responseInt != nil){
response = String(responseInt!)
}
print(response!)
}
}
let surveyQuality01 = SurveyPlatzi(text: "Cual es tu nombre?")
let surveyQuality02 = SurveyPlatzi(text: "Cual es tu edad?")
let surveyQuality03 = SurveyPlatzi(text: "Cual es tu curso de Platzi Favorito?")
surveyQuality01.ask()
surveyQuality01.responseText = "Fulanito Perez"
surveyQuality01.printReponse()
surveyQuality02.ask()
surveyQuality02.responseInt = 41
surveyQuality02.printReponse()
surveyQuality03.ask()
surveyQuality03.responseText = "El de Keynote le tengo mucho carinio"
surveyQuality03.printReponse()
let text : String
var responseText : String?
var responseInt : Int?
init(text: String){
self.text = text
}
func ask(){
print(text)
}
func printReponse(){
var response : String?
if (responseText != nil){
response = responseText
} elseif(responseInt != nil){
response = String(responseInt!)
}
print(response!)
}
}
let surveyQuality01 = SurveyPlatzi(text: "Cual es tu nombre?")
let surveyQuality02 = SurveyPlatzi(text: "Cual es tu edad?")
let surveyQuality03 = SurveyPlatzi(text: "Cual es tu curso de Platzi Favorito?")
surveyQuality01.ask()
surveyQuality01.responseText = "Fulanito Perez"
surveyQuality01.printReponse()
surveyQuality02.ask()
surveyQuality02.responseInt = 41
surveyQuality02.printReponse()
surveyQuality03.ask()
surveyQuality03.responseText = "El de Keynote le tengo mucho carinio"
surveyQuality03.printReponse()
Un intento de formulario
classSurveyQuestion{varmakeAQuestion:StringvarresponseName:String?,responseLastName:String?,responseAge:Int?,responseFrom:String?init(_ makeAQuestion:String){ self.makeAQuestion= makeAQuestion
}}let q1 =SurveyQuestion("¿What is your name?")let q2 =SurveyQuestion("¿What is your last name?")let q3 =SurveyQuestion("¿How old are you?")let q4 =SurveyQuestion("¿Where are you from?")q1.responseName="Diego"q2.responseLastName="Seitler"q3.responseAge=27q4.responseFrom="Argentina"iflet name = q1.responseName,let lastName = q2.responseLastName,let age = q3.responseAge,letfrom= q4.responseFrom{print("Data Form \n \(q1.makeAQuestion): \(name) \n \(q2.makeAQuestion): \(lastName) \n \(q3.makeAQuestion): \(age) \n \(q4.makeAQuestion): \(from)")}else{print("The Data Form is not complete")}/*
Data Form
¿What is your name?: Diego
¿What is your last name?: Seitler
¿How old are you?: 27
¿Where are you from?: Argentina
*/
Yo lo resolví de la siguiente manera.
classSurveyQuestion{letquestionText:Stringvarresponse:String?init(_ questionText:String){ self.questionText= questionText
} func ask(){print(questionText)} func responseQuestion()->String{iflet response = self.response{return"La espuesta es: \(response)"}else{return"Sin ninguna respuesta"}}}let questionOne =SurveyQuestion("¿Te gustan los tacos?")questionOne.ask()questionOne.response="Claro que si perro :v"let questionTwo =SurveyQuestion("¿Cuál es tu profesor favorito de Platzi?")questionTwo.ask()questionTwo.response="Juan Gabriel Gomila"questionTwo.responseQuestion()let questionThree =SurveyQuestion("¿Te es complicado el taller de POO con Swift?")questionThree.ask()questionThree.responseQuestion()
classSurveyQuestion{lettext:Stringvarresponse:String?init(_ text:String){ self.text= text
} func ask(){print(text)}}let q1 =SurveyQuestion("¿Cual es tu nombre?")let q2 =SurveyQuestion("¿Cual es tu edad?")let q3 =SurveyQuestion("¿Cual es tu curso favorito de platzi")let q4 =SurveyQuestion("¿Cual es tu instructo favorito?")q1.ask()
Este es un pequeño ejemplo también dando como opción ver la respuesta
classSurveyQuestion{vartext:Stringvarresponse:String?init(text:String){ self.text= text
} func ask(){print(text)}}let q1 =SurveyQuestion(text:"¿Te gustan los tacos?")q1.ask()q1.response="Si..."classmyQuestions{letquestion:Stringvarresponse:Any?init(question:String){ self.question= question
} func viewReponse(){iflet userRespond = response
{print(userRespond)}else{print("// El usuario no ha dado ninguna respuesta //")}} func ask(){print(question)}}let myQ1 =myQuestions(question:"¿Te gusta Platzi?")myQ1.ask()myQ1.response="Si..."myQ1.viewReponse()let myQ2 =myQuestions(question:"¿Cual es tu nombre?")myQ2.ask()myQ2.response="Yael"myQ2.viewReponse()let myQ3 =myQuestions(question:"¿Cual es tu edad?")myQ3.ask()myQ3.response=17myQ3.viewReponse()let myQ4 =myQuestions(question:"Pregunta opcional")myQ4.ask()myQ4.viewReponse()
classSurvayQuestion{lettext:Stringvarresponse:String?init(text:String){ self.text= text
} func ask(){print(text)}}let q1 =SurvayQuestion(text:"Do you like tacos?")let q2 =SurvayQuestion(text:"How old are you?")let q3 =SurvayQuestion(text:"What is your favorite platzi course?")let q4 =SurvayQuestion(text:"What is your favorite teacher?")q1.ask()q2.ask()q3.ask()q4.ask()q1.response="yes, i like them"q2.response="I'm 21 year old"q3.response="My favorite course in platzi is iOS Mobile Developer"q4.response="My favorite teacher is Juan Gomila"