Поделиться через


NSString в Xamarin.iOS и Xamarin.Mac

Структура Xamarin.iOS и Xamarin.Mac требует использования API для отображения собственного типа строки .NET, string, для использования строк на C# и других языках программирования .NET, и для отображения строки в качестве типа данных, предоставляемого API, а не типа данныхNSString.

Это означает, что разработчикам не нужно хранить строки, предназначенные для вызова Xamarin.iOS и API Xamarin.Mac (унифицированный) в специальном типе (Foundation.NSString), они могут использовать System.String Mono для всех операций, и каждый раз, когда для API в Xamarin.iOS или Xamarin.Mac требуется строка, поскольку наша привязка API выполняет упаковку информации.

Например, свойство Objective-C "text" в UILabel типа NSString объявляется следующим образом:

@property(nonatomic, copy) NSString *text

Оно предоставляется в Xamarin.iOS как:

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

В фоновом режиме реализация этого свойства маршалирует строку C# в NSString и вызывает метод objc_msgSend так же, как это делал бы метод Objective-C.

Существует несколько сторонних API Objective-C, которые используют не NSString, а строку C ("char"). В таких случаях вы по-прежнему сможете использовать строковый тип данных C#, однако также понадобиться атрибут [PlainString], чтобы сообщить генератору привязки, что эта строка должна упаковываться не как NSString, а как строка C.

Исключения из правил

В Xamarin.iOS и Xamarin.Mac создано исключение из этого правила. Выбор между предоставлением string и предоставлением NSString в качестве исключения, нужно делать, если метод NSString может выполнить сравнение указателей вместо сравнения содержимого.

Это может произойти, когда API Objective-C используют общедоступную константу NSString в качестве маркера, представляющего некоторое действие, вместо сравнения фактического содержимого строки.

В этих случаях предоставляются NSString API, но таких API меньшинство. Также обратите внимание, что свойства NSString представлены в некоторых классах. Эти NSString свойства предоставляются для таких элементов, как уведомления. Эти свойства обычно выглядят следующим образом:

class Foo {
     public NSString FooNotification { get; }
}

Уведомления — это ключи, которые используются для класса NSNotification, если необходимо выполнить регистрацию для конкретного события, транслируемого средой выполнения.

Ключи обычно выглядят примерно так:

class Foo {
     public NSString FooBarKey { get; }
}

Другое место, где NSString представлены в API, — это маркеры, используемые в качестве параметров для некоторых API в iOS или OS X, принимающие объекты NSDictionary в качестве параметров. Словарь обычно содержит ключи NSString. Xamarin.iOS, по соглашению, именует статические свойства NSString, добавляя имя "Ключ".