xcode - tutorial - Cuándo iniciar un delegado en Swift
swift protocol optional (1)
La opción 2 se ve mejor. Sin embargo, en este caso, sería recomendable utilizar un tipo opcional como delegado. De esta forma, no necesita marcar "if delegate! = Nil" cada vez que quiera realizar una tarea con él. Simplemente puede usar el encadenamiento opcional, que está diseñado específicamente para los casos en que desea realizar una tarea en una opción solo si contiene un valor.
protocol MyClassDelegate {
func doSomething()
}
class MyClass {
var delegate: MyClassDelegate?
init(){
}
func myClassFuction(){
self.delegate?.doSomething() // will do nothing if delegate is nil
}
}
class ClassConformingToDelegate: NSObject, MyClassDelegate {
let myClass: MyClass
override init(){
myClass = MyClass()
super.init()
myClass.delegate = self
}
func doSomething(){
//called from the delegate
}
}
Tengo una pregunta básica. Estoy trabajando en un proyecto con muchos patrones de delegado, y me gustaría hacer referencia sobre la mejor manera de inicializarlos.
Aquí hay algunas ideas con un delegado de prueba que hice:
Opción 1:
No funciona porque estoy iniciando el delegado en self antes de super.init ()
protocol MyClassDelegate {
func doSomething()
}
class MyClass {
var delegate: MyClassDelegate!
init(delegate: MyClassDelegate){
self.delegate = delegate
}
func myClassFuction(){
self.delegate.doSomething()
}
}
class ClassConformingToDelegate: NSObject, MyClassDelegate {
let myClass: MyClass
override init(){
myClass = MyClass(delegate: self) // Error because it''s called before super.init
super.init()
}
func doSomething(){
//called from the delegate
}
}
Opcion 2:
Funciona, pero luego corro el riesgo de que el delegado sea nulo. ¿Tendría que ejecutar un cheque ''if delegate! = Nil'' cada vez que quiera llamar a un método? ¿Hay alguna manera de evitar eso? ¿Es una buena práctica iniciar al delegado de esta manera?
protocol MyClassDelegate {
func doSomething()
}
class MyClass {
var delegate: MyClassDelegate!
init(){
}
func myClassFuction(){
self.delegate.doSomething() // might fail if delegate is nil
}
}
class ClassConformingToDelegate: NSObject, MyClassDelegate {
let myClass: MyClass
override init(){
myClass = MyClass()
super.init()
myClass.delegate = self // works because called after super.init
}
func doSomething(){
//called from the delegate
}
}
Esas fueron solo algunas ideas. Solo estoy tratando de aprender la mejor manera de hacerlo. Estoy abierto a todas las sugerencias.
¡¡Gracias!!