まず、コメントへの回答です。
右辺のuidがBool型となるのは以下の認識であっていますか。
-①---------------
let uid: String
と宣言しているものの、
var isCurrentUser: Bool :となっているため その中のuidもBool型になる
これは私の説明が適切でありませんでした。
申し訳ありません。
uid
は String
なので、右辺値は当然 String
になります。
-②----------
let ア uid: String
var isCurrentUser: Bool { return Auth.auth().currentUser?.イuid == ウuid }
右辺には、アのuidを代入している。
①よりString型からBool型になっている。
下記の文章中で、String?
型どうしの比較(オペレータ、演算子)の定義について説明してありますが、
Swift
1static func == (lhs: String?, rhs: String?) -> Bool
という具合に、String?
と String?
の比較をした結果が Bool
型で戻ります。
なので、当然戻り値は Bool
型となります(比較結果の詳しい表は下記をご参照ください)
ちなみに、オプショナル型に非オプショナル型を代入することは可能です。
なので、==
演算子の右辺値は String? (Optional<String>)
となっていますが、String
型として比較させることは問題ありません。
ただし、逆(つまりString
にOptional<String>
を代入すること)はできません。
この辺りの説明については、回答の範疇を超えそうですし、きちんとした参考書を読めばわかることなので、ぜひ参考書の購入をご検討ください(掲示板やネット記事の断片的な情報では正しい知識を得ることは難しいです)。
日本語として記述された Swift 文法書のうち、現時点で一番詳しく、また広く網羅されている本して下記の書籍があります。
たとえば、これまでの一連の回答のうち、キーワードとなっている文法は次のページに解説があります。
- オプショナル型 96ページ
- 演算子の定義(
==
の定義など)81ページ
- オプショナルチェーン 243ページ
- クロージャとキャプチャ(参照)関係 310ページ
- 遅延格納型プロパティ(
lazy
) 339ページ
正直、上記の書籍は Swift言語本の中では容易は部類ですが、それでもいきなり難しい話があったりして読み進めるのにそれなりの苦労が伴う書籍です。
しかし、現時点で日本語で詳しく説明してあり、また実行可能な例題が豊富な書籍は他にありませんので、ぜひこのような参考書を一冊携えられることを強く推奨します。
認識があっているか確認してほしい点
・左辺 Auth.auth().currentUser?.uid の値と右辺 uidの値が一致していればtrue そうでなければfalseになる。
これは、半分正解で半分間違です。
「半分正解で半分間違い」という表現は適切で無いと判断したので表現を変えます。
「両辺の値が一致してれば true
という意味では正解だが、その結果は妥当と言えない場合がある」ということです。
後半でオプショナルチェインの話が出てきますが、オプショナルチェインの結果とある値を比較させるのは、可読性が低い表現ではないかと思います(これは、参考にされているテキストの問題ですが)。
仮に、左辺のオプショナルチェインの結果が nil
、 uid
の値が nil
だった場合、この判定式は true
になりますが、本質的にそれは何を意味しているのかはこの表現だけではわかりません。
もちろん、uid
はオプショナル値では無いということを確信できるのであれば問題はないのですが(ご提示いただいたコードから判断すると、uid
は String
なので nil
はとりえないことはわかりますが)、それを確信できるのはこの式を記述した人だけなので(ある変数がオプショナル値なのか否かを見ただけで判断する方法はないため)、そういう意味で適切ではないし、可読性も低いと考えています。
以下本文です。
注意していただきたいのは、Optional<Bool>
型と Bool
型の比較を行なっている点です。
注意していただきたいのは、Optional<String>
型と String
型の比較を行なっている点です。
(以下適宜変更しています)
==
演算子の両辺が String
型であれば、単に両辺の値を比較し、同じであればtrue
, 違えばfalse
になります。
しかしこの場合、片方が Optinal<String>
(String?
)型のため、比較方法が少し異なってきます。
オンラインの公式ドキュメントでは見つかりませんでしたが(Equatable にあるかと思ったら無い)、Xcode のオンラインドキュメントには次のように記載がありました。
Returns a Boolean value indicating whether two optional instances are equal.
Declaration
Swift
1static func == (lhs: String?, rhs: String?) -> Bool
Discussion
Use this equal-to operator (==) to compare any two optional instances of a type that conforms to the Equatable protocol. The comparison returns true if both arguments are nil or if the two arguments wrap values that are equal. Conversely, the comparison returns false if only one of the arguments is nil or if the two arguments wrap values that are not equal.
後半に、Conversely, the comparison returns false if only one of the arguments is nil とありますが、これは比較しようとしている値の片方が nil
である場合、false
が戻る、という意味です。
なので、この演算子の振る舞いを整理すると次のようになります。
ここでは、説明を簡易にするため、右辺値と左辺値に与える値は固定した文字列、もしくは nil
とします。
|左辺値|右辺値|結果|
|:====|:====|:===|
|ABC
|DEF
|両辺は違う文字列なのでfalse
|
|DEF
|ABC
|両辺は違う文字列なのでfalse
|
|ABC
|ABC
|両辺は同じ文字列なのでtrue
|
|nil
|ABC
|nil
と文字列の比較なのでfalse
|
|ABC
|nil
|文字列とnil
の比較なのでfalse
|
|nil
|nil
|nil
とnil
の比較なのでtrue
|
となります。
注意していただきたいのは、nil
と nil
の比較は true
だと横転です。
ちなみに、今回のコード
Swift
1var isCurrentUser: Bool { return Auth.auth().currentUser?.uid == uid }
ですが、左辺値がオプショナルチェインの結果、nil
になり得ることにご注意ください(オプショナルチェインについては、先日ご説明したかとおもいます)。
ちなみに、振る舞いがわからない場合、Xcode のヘルプ機能を活用するのが一番手っ取り早いです。
Optionキーを押しながらドラッグし、わからない関数(演算子も含む)やプロパティにポインタを移動させると、? マークが出ることがあります。
これはオンラインヘルプがある、ということですので、クリックすることでオンラインヘルプを見ることができます。
英語ですが、コピーして翻訳させてみても良いでしょうし、ここからいくつかのキーワードを拾って検索するのも一つかと思います。