Asignar una constante NSString a otra

Quiero definir NSString constantes NSString y hacer que una de ellas se refiera a otra. Por ejemplo:

 NSString * const kUrlGoogle = @"http://google.com"; NSString * const kUrlApple = @"http://apple.com"; NSString * const kUrlMicrosoft = @"http://microsoft.com"; NSString * const kUrlDefault = kUrlGoogle; 

Cuando bash hacer esto, obtengo un error de time de compilation en la línea kUrlDefault :

El elemento del inicializador no es una constante del time de compilation

¿Hay alguna manera de asignar kUrlDefault a una de las cadenas de arriba sin recurrir al uso de macros?

Aquí hay algunas razones por las cuales esto puede ser útil:

  • Podría probar la igualdad sin tener que llamar al método isEqual .
  • Si actualizo la constante, kUrlDefault obtendrá automáticamente el nuevo valor (como con todas las constantes).
  • Mantener todas las constantes juntas en un file en la misma location.

Creo que necesitas dar un paso atrás y pensar si la cadena debe definirse como const.

Claramente, la cadena no es una constante ya que está intentando asignar un nuevo valor a la misma, y ​​eso no es posible ya que usted específicamente le indicó al comstackdor que se asegurara de que el valor no se modificara usando la palabra key const.

Si la cadena reside como una propiedad en una class, podría convertirla en una propiedad de solo lectura, es decir, método de acceso pero no método de establecimiento. Podrías build tu cadena como desees en la class internamente y evitar que las personas que llaman cambien el valor.

Tienes unas cuantas opciones.

1) Establezca kUrlDefault en el método de + (void)initialize de la class. Sin embargo, esto tiene una gran desventaja. Requeriría que la class se haga reference de alguna manera antes de cualquier uso de la constante. De lo contrario, la constante aún no se inicializará.

2) Refactorice la constante kUrlDefault en un método de class. La implementación del método devolvería el valor pnetworkingeterminado deseado. Una ventaja de este enfoque es que agrega un scope al global porque se convertiría en una variable de nivel de class en lugar de una constante de nivel de aplicación.

Las constantes establecidas fuera de cualquier function no pueden ser dinámicas.

Puede utilizar este método en una function, no fuera, tal vez pueda funcionar con C ++ o con el objective C ++ (los estándares C ++ son más flexibles con eso)

Utilicé esta solución (no sé si este método se ajustará a sus necesidades):

 NSString *kUrlGoogle = @"http://google.com"; NSString *kUrlApple = @"http://apple.com"; NSString *kUrlMicrosoft = @"http://microsoft.com"; 

y más tarde, en otro lugar, puedes get la var que quieras con:

 extern NSString *kUrlGoogle;