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) は型キャスト。