Partager via


NSString dans Xamarin.iOS et Xamarin.Mac

La conception des appels Xamarin.iOS et Xamarin.Mac pour l’API d’utilisation pour exposer le type de chaîne .NET natif, pour stringla manipulation de chaînes dans C# et d’autres langages de programmation .NET, et pour exposer la chaîne comme type de données exposé par l’API au lieu du type de données.NSString

Cela signifie que les développeurs ne doivent pas avoir à conserver les chaînes destinées à être utilisées pour appeler dans l’API Xamarin.iOS &Xamarin.Mac (unifiée) dans un type spécial (Foundation.NSString), elles peuvent continuer à utiliser Mono System.String pour toutes les opérations, et chaque fois qu’une API dans Xamarin.iOS ou Xamarin.Mac nécessite une chaîne, notre liaison d’API s’occupe du marshaling des informations.

Par exemple, la Objective-C propriété « text » sur un UILabel type NSStringest déclarée comme suit :

@property(nonatomic, copy) NSString *text

Ceci est exposé dans Xamarin.iOS comme suit :

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

En arrière-plan, l’implémentation de cette propriété marshale la chaîne C# en une NSString et appelle la objc_msgSend méthode de la même façon que cela Objective-C .

Il existe une poignée d’API tierces Objective-C qui ne consomment pas un NSString, mais consomment plutôt une chaîne C (un « char »). Dans ce cas, vous pouvez toujours utiliser le type de données de chaîne C#, mais vous devez utiliser l’attribut [PlainString] pour informer le générateur de liaison que cette chaîne ne doit pas être marshalée en tant que NSStringchaîne , mais plutôt en tant que chaîne C.

Exceptions à la règle

Dans Xamarin.iOS et Xamarin.Mac, nous avons fait une exception à cette règle. La décision entre le moment où nous exposons stringet quand nous faisons une exception et NSStringles s, est prise si la NSString méthode peut effectuer une comparaison de pointeurs au lieu d’une comparaison de contenu.

Cela peut se produire lorsqu’une Objective-C API utilise une constante publique NSString en tant que jeton qui représente une action, au lieu de comparer le contenu réel de la chaîne.

Dans ces cas, NSString les API sont exposées et il existe une minorité d’API qui en ont. Vous remarquerez également que les propriétés NSString sont exposées dans certaines classes. Ces NSString propriétés sont exposées pour les éléments tels que les notifications. Ces propriétés ressemblent généralement à ceci :

class Foo {
     public NSString FooNotification { get; }
}

Les notifications sont des clés utilisées pour la NSNotification classe lorsque vous souhaitez vous inscrire à un événement particulier en cours de diffusion par le runtime.

Les clés ressemblent généralement à ceci :

class Foo {
     public NSString FooBarKey { get; }
}

Un autre endroit où NSStrings’exposent dans l’API est en tant que jetons utilisés comme paramètres pour certaines API dans iOS ou OS X qui prennent NSDictionary des objets en tant que paramètres. Le dictionnaire contient généralement des NSString clés. Xamarin.iOS, par convention, nomme ces propriétés statiques NSString en ajoutant le nom « Key ».