Compartir vía


NSString en Xamarin.iOS y Xamarin.Mac

El diseño de Xamarin.iOS y Xamarin.Mac llama a la API de uso para exponer el tipo de cadena de .NET Native, string, para la manipulación de cadenas en C# y otros lenguajes de programación de .NET y para exponer la cadena como el tipo de datos expuesto por la API en lugar del tipo de datos NSString.

Esto significa que no es necesario que los desarrolladores deban conservar las cadenas pensadas para llamar a la API Xamarin.iOS y Xamarin.Mac (unificadas) en un tipo especial (Foundation.NSString), pueden seguir usando System.String de Mono para todas las operaciones y, siempre que una API de Xamarin.iOS o Xamarin.Mac requiera una cadena, nuestro enlace de la API se encarga de serializar la información.

Por ejemplo, la propiedad "text" de Objective-C en un UILabel de tipo NSString, se declara de la siguiente manera:

@property(nonatomic, copy) NSString *text

Esto se expone en Xamarin.iOS como:

class UILabel {
    public string Text { get; set; }
}

En segundo plano, la implementación de esta propiedad serializa las cadenas de C# en un elemento NSString y llama al método objc_msgSend de la misma manera que lo haría Objective-C.

Hay varias API de Objective-C de terceros que no consumen un elemento NSString, sino que consumen una cadena de C (“char”). En esos casos, todavía se puede usar el tipo de datos de cadena de C#, pero se debe usar el atributo [PlainString] para informar al generador de enlaces de que esta cadena no debe serializarse como NSString, sino como una cadena de C.

Excepciones a la regla

Tanto en Xamarin.iOS como en Xamarin.Mac, existe una excepción a esta regla. La decisión entre el momento en que se exponen los elementos string y cuando se aplica una excepción y se exponen los elementos NSString se toma cuando el método NSString podría estar realizando una comparación de puntero en lugar de una comparación de contenido.

Esto puede ocurrir cuando una API de Objective-C usa una constante pública NSString como un token que representa alguna acción, en lugar de comparar el contenido real de la cadena.

En estos casos, se exponen las API de NSString, y hay una minoría de API que tienen esto. También observará que las propiedades NSString se exponen en algunas clases. Estas propiedades NSString se exponen para elementos como las notificaciones. Estas propiedades suelen tener el siguiente aspecto:

class Foo {
     public NSString FooNotification { get; }
}

Las notificaciones son claves que se usan para la clase NSNotification cuando desea registrarse para un evento determinado que el tiempo de ejecución difunde.

Las claves suelen ser parecidas a esta:

class Foo {
     public NSString FooBarKey { get; }
}

Otro lugar donde se exponen los elementos NSString en la API es como tokens que se usan como parámetros para determinadas API de iOS u OS X que toman objetos NSDictionary como parámetros. Normalmente, el diccionario contiene claves NSString. Xamarin.iOS, por convención, nombra esas propiedades NSString estáticas agregando el nombre "Key".