Me pregunto por qué Apple está utilizando (bastante en CoreAnimation, pero también en otras partes) las constantes que se declaran como NSString * const
como por ejemplo kCAGravityTop
en lugar de las enumeraciones regulares? ¿Qué tal tipo de seguridad en este caso? Tal como lo entiendo, uno podría pasar cualquier NSString a un método esperando esta constante sin recibir ninguna advertencia del compilador.Razones para usar las constantes de NSString sobre las enumeraciones
Respuesta
No estoy seguro, pero supongo que tiene que ver con que los usuarios agreguen sus propias extensiones y subclases a algunas de las cosas de Apple. En ese caso, puede anular el método utilizado y detectar el caso donde la cadena es "MyOwnValue" y luego hacer lo que quiera con ella. Esto es significativamente más fácil que tener que modificar la enumeración de Apple, y también evita que se arruine todo.
También podría ser para facilitar que Apple tenga independencia de versión. Con enumeraciones, si reorganiza su orden de alguna manera, puede causar muchos problemas para cualquiera de sus valores que se han almacenado en caché (por la razón que sea). Si el valor de la enumeración es 1 < < 3 cuando se guarda en un archivo, Apple agrega otra enumeración para que su valor sea ahora 1 < < 4, entonces, obviamente, lo que está saliendo mal es su programa. ¿Por qué no tendrían cuidado de mover los valores enum, no lo sé, pero creo que es muy probable que hayan usado NSString porque no hay forma de que su valor u orden se pueda cambiar en cualquier versión.
Sospecho que el motivo es histórico o estilístico más que cualquier otra cosa. Así es como lo hicieron los marcos NeXT y crearon el "estilo" Cocoa. Como beneficio de este enfoque, inspeccionar el valor en el depurador puede dar un valor significativo (por ejemplo, @ "CAGravityTop" o algo así en lugar de un sentido int
). Debido a que el compilador maneja las cadenas estáticas de manera inteligente, la comparación puede ser mediante comparación de punteros en lugar de igualdad de cadenas (vea la respuesta de bbum), por lo que este enfoque tiene un rendimiento insignificante.
Los tipos enumerados no se pueden extender sin agregar entradas adicionales dentro del tipo enumerado. Por lo tanto, es imposible tener contenidos de enumeración que sean tratados como un miembro formal del tipo enumerado, pero tampoco son visibles durante la compilación normal.
Tome CoreAnimation, por ejemplo. Puede haber valores que se usan internamente que no son compatibles o están disponibles a través de la API pública por una variedad de razones; El "detalle de la implementación" viene inmediatamente a la mente.
Más allá de eso, las cadenas como constantes permiten la extensión como implica Eli. También tienden a ser mucho más informativos cuando se depuran. "kCAGravityTop" es mucho más indicativo que, por ejemplo, "4".
En términos de rendimiento, hay muy poca penalización al uso de cadenas. El compilador maneja de manera eficiente las cadenas estáticas, de las cuales se compone en realidad la contraparte interna de cada constante de cadena, y la primera prueba del método -isEqualToString: es la igualdad del puntero, muy rápido. No tan rápido como un interruptor(), pero dada la magnitud de la ejecución del código implicada por la constante, la diferencia de pocos ciclos entre el interruptor() y la comparación de la cadena es irrelevante.
Una de las razones más pensaba en favor de NSString es que puede pasar alrededor de donde id
se acepta (como userInfo
o como teclas de diccionario) mientras que los tipos primitivos (enumeraciones) necesitarían algún tipo de envoltorio para este
- 1. ¿Pueden las constantes NSString estar vinculadas débilmente?
- 2. Enumeraciones y constantes. ¿Qué usar cuando?
- 3. Razones para las diferencias SQL
- 4. Las razones para actualizar de Delphi 2009
- 5. Cómo definir adecuadamente las constantes
- 6. ¿Cómo tener nombres fáciles de usar para las enumeraciones?
- 7. Las ventajas de las constantes
- 8. ¿Por qué las personas usan enumeraciones en C++ como constantes mientras pueden usar const?
- 9. Razones para usar Subversion sobre MS Source Safe
- 10. ¿Por qué razones las personas eligen Ruby sobre Java?
- 11. ¿por qué usar constantes de cadena frente a constantes enum?
- 12. interactuando sobre las constantes de enumeración en JSP
- 13. C# - ¿son todas las constantes de Enum?
- 14. razones para no usar typekit?
- 15. ¿Hay razones para preferir matrices sobre ArrayLists?
- 16. PHP - Razones para usar Iterators?
- 17. cómo compartir constantes (enumeraciones) entre clases?
- 18. Comprensión de las enumeraciones scala
- 19. mejores prácticas de C++ para las constantes
- 20. ¿Cuáles son las razones de peso para usar un MemoryCache sobre una llanura de edad Dictionary <string, object>
- 21. Creando funciones sobre Enumeraciones
- 22. ¿Cuáles son algunas de las razones por las cuales un único desarrollador debe usar TDD?
- 23. La forma correcta de usar las constantes Globals
- 24. Uso de las enumeraciones en ctypes.Structure
- 25. Además de singletons, ¿cuáles son algunas de las razones convincentes para usar métodos estáticos en PHP?
- 26. C# enumeraciones Públicas de las clases
- 27. Cómo usar enumeraciones en las señales y ranuras Qt
- 28. ¿Por qué las enumeraciones de TypeLib no están expuestas como enumeraciones en Visual Basic 6.0?
- 29. en caso de que utilice siempre las enumeraciones en vez de constantes en Java
- 30. Enumeraciones de Java vs. constantes estáticas
+1 Buena hipótesis – h4xxr
Además, creo que archivar y desinstalar es un factor.Ahora con frameworks como Core Data que se usan mucho más extensamente, encontrará que si se usan enumeraciones hay un montón de boxeo y unboxing que solo se pueden factorizar si se usan cadenas en su lugar, aunque algunas consideraciones permanecen para las constantes de cadena: la carga innecesaria "plomería" se reduce. – TheBasicMind