Objective-cメモ
@react-native-firebase/auth: "16.0.0"のobjcのコードを読まなきゃいけない機会があったのでそれを元にobjcの文法をメモる。
変数の前につく * ってなに
NSDictionary *authCredentialDict = nil;
ポインタであることを表す。
NSDictionaryはobjcのオブジェクト型であり(C由来のプリミティブ型ではない)、オブジェクトはポインタとして扱う必要があるので変数名の前に * をつけている。
メソッド定義
- (NSDictionary *)firebaseUserToDict:(FIRUser *)user { ... }
これは NSDictionary型の の戻り値があり、FIRUser型の引数 user をとる firebaseUserToDict というメソッドを定義している。
2つ目の引数から定義の方法がちょっと違う
- (void)promiseWithUser:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject user:(FIRUser *)user {
第二引数以降は「ラベル」をつける(任意だけど基本つける)。
ラベル:(型):引数名
となる。
呼び出し元からはラベルを指定して引数を渡すことができる。
メソッドの呼び出し
[self promiseWithUser:resolve rejecter:reject user:userAfterUpdate];
[クラス or インスタンス名 メソッド名:第一引数 (ラベル):引数];
return @{} の@ってなに
// firebaseUserToDict return @{ ... };
objcのオブジェクトを表す。
objcにはC言語由来のプリミティブ型とobjcで使用できるオブジェクト型が存在する。オブジェクト型を使用するには値の先頭に @ をつけないといけない。
@{}内のデータで、@がついているフィールドとついてないフィールドがあるが、なに
// firebaseUserToDict return @{ ... keyEmail : user.email ? (id)user.email : [NSNull null], @"emailVerified" : @(user.emailVerified), ... }
キーは既にNSStringで定義されているもの。値はオブジェクトにしなければいけないため。
キーで keyEmail と @"emailVerified" がある。keyEmailは既に static NSString *const keyEmail = @"email"; と定数化されているものを使用している。
値に関してはまず user.email はNSString であり、それをそのまま使用している。
user.emailVerifiedは BOOL なのだが、NSDictionary はプリミティブを値に持てない。なのでこれをオブジェクトにする必要がある。この場合はNSNumberに解釈される。(BOOLはYESなら1, NOなら0を返す)
(id)user.email の (id) は型キャスト。