Share via


Xamarin.iOS と Xamarin.Mac での NSString

Xamarin.iOS と Xamarin.Mac のどちらの設計でも、API を使用して、C# や他の .NET プログラミング言語での文字列操作のためにネイティブの .NET 文字列型である string を公開することと、NSString データ型ではなく、API によって公開されるデータ型として文字列を公開することが必要とされます。

つまり、開発者は、特殊な型 (Foundation.NSString) で Xamarin.iOS および Xamarin.Mac の API (Unified) の呼び出しに使用するための文字列を保持する必要はなく、すべての操作に Mono の System.String を使用し続けることができます。また、Xamarin.iOS または Xamarin.Mac の API で文字列が必要なときはいつでも、API バインドによって情報のマーシャリングが行われます。

たとえば、NSString 型の UILabel で、Objective-C "text" プロパティが、次のように宣言されます。

@property(nonatomic, copy) NSString *text

これは、Xamarin.iOS では次のように公開されます。

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

見えないところで、このプロパティの実装によって C# の文字列が NSString にマーシャリングされ、Objective-C と同じ方法で objc_msgSend メソッドが呼び出されます。

NSString を使用する代わりに C の文字列 (char) を使用するサードパーティの Objective-C API がいくつかあります。 そのような場合でも、C# の文字列データ型を使用できますが、この文字列を NSString としてマーシャリングするのではなく、C 文字列としてマーシャリングする必要があることを、[PlainString] 属性を使用して、バインド ジェネレーターに通知する必要があります。

ルールの例外

Xamarin.iOS と Xamarin.Mac の両方で、このルールに対する例外が設けられています。 NSString メソッドによって、コンテンツ比較ではなく、ポインター比較が行われている可能性がある場合、string を公開するか、NSString を例外的に公開するかが決定されます。

これは、Objective-C API で、文字列の実際の内容を比較するのではなく、何らかのアクションを表すトークンとしてパブリック NSString 定数が使用されている場合に、発生することがあります。

そのような場合は、NSString API が公開され、これを使用する少数の API があります。 また、NSString プロパティが一部のクラスで公開されていることにもご注意ください。 それらの NSString プロパティは、通知などの項目に対して公開されます。 それらのプロパティは、通常、次のようになります。

class Foo {
     public NSString FooNotification { get; }
}

通知は、ランタイムによってブロードキャストされる特定のイベントに登録するときに、NSNotification クラスに使用されるキーです。

通常、キーは次のようになります。

class Foo {
     public NSString FooBarKey { get; }
}

NSString が API で公開されるもう 1 つの場合は、NSDictionary オブジェクトをパラメーターとして受け取る iOS または OS X の特定の API に対するパラメーターとして使用されるトークンです。 通常、ディクショナリには NSString キーが含まれます。 Xamarin.iOS では、慣例により、そのような静的 NSString プロパティの名前に "Key" が付加されます。