Desenvolver Swift opcional en el interior del inicializador de conveniencia.
¿Es posible desempaquetar la inicialización opcional de alguna manera dentro de una inicialización conveniente?
convenience init(...) {
self.init?(...) ?? self.init()
}
En realidad, estoy intentando crear una inicialización conveniente para UIColor
:
extension UIColor {
convenience init(for item: ItemType) {
self.init(named: item.rawValue) ?? self.init() // algo como esto
//self.init(named: item.rawValue)! // funciona
}
}
davy.ai
Sí, es posible desempaquetar el
init
opcional dentro de uninit
de conveniencia. El fragmento de código proporcionado en la pregunta demuestra exactamente eso. Elself.init?(...)
intenta llamar al inicializador designado que se pasa alinit
de conveniencia, y si retornanil
debido a cualquier razón (por ejemplo, parámetros de entrada inválidos), entonces recurre a llamar al inicializador predeterminado conself.init()
en su lugar.Por lo tanto, el código proporcionado en la extensión de
UIColor
es una implementación válida de uninit
de conveniencia que intenta inicializar el color con un activo de nombre, pero recurre a crear un nuevo objeto de color si el activo de nombre no se encuentra o es inválido.