[解決済み] Objective-Cには強い型付けのコレクションがありますか?
2022-05-13 17:15:15
質問
Mac/iPhone のプログラミングと Objective-C の初心者です。 C# と Java には、宣言された型にのみ対応するメンバーを持つコレクション クラス、quot;generics" があります。 たとえば、C#では
Dictionary<int, MyCustomObject>
は整数であるキーと MyCustomObject 型である値のみを含むことができます。 Objective-Cにも同じようなメカニズムがあるのでしょうか?
どのように解決するのですか?
Xcode 7 では、Apple は Objective-C に 'Lightweight Generics' を導入しました。Objective-C では、型の不一致がある場合、コンパイラーの警告を生成します。
NSArray<NSString*>* arr = @[@"str"];
NSString* string = [arr objectAtIndex:0];
NSNumber* number = [arr objectAtIndex:0]; // Warning: Incompatible pointer types initializing 'NSNumber *' with an expression of type 'NSString *'
そして、Swiftのコードでは、それらはコンパイラーエラーを発生させます。
var str: String = arr[0]
var num: Int = arr[0] //Error 'String' is not convertible to 'Int'
Lightweight Genericsは、NSArray、NSDictionary、NSSetで使用することを想定していますが、独自のクラスに追加することも可能です。
@interface GenericsTest<__covariant T> : NSObject
-(void)genericMethod:(T)object;
@end
@implementation GenericsTest
-(void)genericMethod:(id)object {}
@end
Objective-Cはコンパイラの警告で以前と同じような動作をします。
GenericsTest<NSString*>* test = [GenericsTest new];
[test genericMethod:@"string"];
[test genericMethod:@1]; // Warning: Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'
というように記述しますが、SwiftはGenericの情報を完全に無視します。(Swift3+ではもはや真ではありません)。
var test = GenericsTest<String>() //Error: Cannot specialize non-generic type 'GenericsTest'
これらの Foundation コレクションクラス以外では、Objective-C の軽量ジェネリックスは Swift では無視されます。軽量ジェネリックスを使用する他の型は、それらがパラメータ化されていないかのように、Swift にインポートされます。
関連
-
[解決済み] Objective-CでNSStringsを連結するためのショートカット集
-
[解決済み] Objective-Cの定数
-
[解決済み] Objective-Cで乱数を発生させる
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Objective-Cで、ある文字列が他の文字列を含んでいるかどうかを調べるにはどうすればよいですか?
-
[解決済み] Objective-Cのtypedef enumとは何ですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] 強型付け言語と静的型付け言語の違いは何ですか?
-
[解決済み】Rでリストを正しく使用する方法とは?
-
[解決済み】Pythonは強型付けされていますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] dispatch_after - GCD in Swift?
-
[解決済み] Objective-Cでオブジェクトをキャストする方法
-
[解決済み] Objective-Cは構造体の使用を禁じていますか?
-
非静的宣言に続く "****"の静的宣言
-
[解決済み] メソッド名と行番号を出力し、NSLogを条件付きで無効にする方法は?
-
[解決済み] CocoaPodsを使用している場合、.gitignoreには何が入るのでしょうか?
-
[解決済み] ブロック内の変数をブロック外の変数に代入する
-
[解決済み】NSArrayをアルファベット順に並べるには?
-
[解決済み】Objective-C: パス文字列からファイル名を抽出する
-
[解決済み】Windows版Objective-C