Agregue una extensión/método a todos los objetos en Swift
oop methods (1)
No. Has respondido bastante a tu propia pregunta: los objetos Swift no tienen una clase base, y la única forma real de NSObject
es heredar de NSObject
.
En Objective-C, todos los objetos pueden tratarse como id de tipo, y casi todos los objetos heredan de NSObject. (Los bloques no, pero esa es la única excepción).
Por lo tanto, es posible crear una categoría Objective-C que amplíe TODOS los objetos Objective-C. (ignorando bloques)
En Objective-C, creé una extensión para NSObject que usa objetos asociados para adjuntar opcionalmente un diccionario a cualquier NSObject. Eso me permitió implementar los métodos setAssocValue:forKey:
y assocValueForKey:
eso hace posible adjuntar un par de clave / valor a cualquier NSObject. Esto es útil en muchas circunstancias.
Permite agregar propiedades almacenadas a una categoría, por ejemplo. Simplemente escribe un getter / setter que usa los métodos de valor asociados para adjuntar un objeto almacenado, y listo.
También permite adjuntar valores a objetos del sistema existentes en tiempo de ejecución. Puede colgar datos o bloques de código en botones, o hacer lo que necesite hacer.
Me gustaría hacer lo mismo en Swift.
Sin embargo, Swift no tiene una clase base común para todos los objetos como Objective-C. AnyObject
y Any
son protcols.
Así,
extension AnyObject
No compilará
No sé dónde "adjuntar" mis setAssocValue:forKey:
y assocValueForKey:
en Swift.
Podría crear una clase base para mi extensión, pero eso frustra el uso de una extensión. Podría hacer que mi objeto base sea un NSObject de Objective-C, pero eso significa que todos mis objetos deben ser NSObjects, y los objetos Swift no son NSObjects de forma predeterminada.
(Por cierto, esta pregunta se aplica tanto a las plataformas Mac OS como iOS)