🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1376閲覧

Bool型に関する認識があっているか確認してほしいです。

momokoko

総合スコア38

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/02/23 16:39

編集2021/02/23 16:39

var isCurrentUser: Bool { return Auth.auth().currentUser?.uid == uid }
上記コードの認識が正しいか確認にてほしいです。

認識があっているか確認してほしい点
・左辺 Auth.auth().currentUser?.uid の値と右辺 uidの値が一致していればtrue そうでなければfalseになる。

以下、全体のコード

import Foundation import Firebase struct User { let email: String let fullname: String let profileImageUrl: String let username: String let uid: String var isFollowed = false var isCurrentUser: Bool { return Auth.auth().currentUser?.uid == uid } init(dictionary: [String: Any]) { self.email = dictionary["email"] as? String ?? "" self.fullname = dictionary["fullname"] as? String ?? "" self.profileImageUrl = dictionary["profileImageUrl"] as? String ?? "" self.username = dictionary["username"] as? String ?? "" self.uid = dictionary["uid"] as? String ?? "" } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi_takatsuk

2021/02/23 17:20

このコードを実行してみてどうなりましたか?
momokoko

2021/02/25 05:13 編集

コメントありがあとうございます。 エラーなく動作しています。 質問の背景としてUdemyの講座で先生が書いているコードの質問になります。 先生の解説でも理解できなかったところをこちらで質問させて頂いております。
miyabi_takatsuk

2021/02/25 07:02

であれば、質問本文にその旨記載しましょう。
momokoko

2021/02/25 14:50

海外の先生で英語でしか質問できず、以前、質問してみたんですが、うまく噛み合わなかった経験からこちらで質問させていただいております。 全体のコードのうち一部しか記載できず回答して頂ける方にはもどかしい思いを強いてさせてしまっていて申し訳ないです。
guest

回答2

0

ベストアンサー

まず、コメントへの回答です。

右辺のuidがBool型となるのは以下の認識であっていますか。
-①---------------
let uid: String
と宣言しているものの、
var isCurrentUser: Bool :となっているため その中のuidもBool型になる

これは私の説明が適切でありませんでした。
申し訳ありません。

uidString なので、右辺値は当然 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 型として比較させることは問題ありません。

ただし、逆(つまりStringOptional<String>を代入すること)はできません。

この辺りの説明については、回答の範疇を超えそうですし、きちんとした参考書を読めばわかることなので、ぜひ参考書の購入をご検討ください(掲示板やネット記事の断片的な情報では正しい知識を得ることは難しいです)。

日本語として記述された Swift 文法書のうち、現時点で一番詳しく、また広く網羅されている本して下記の書籍があります。

たとえば、これまでの一連の回答のうち、キーワードとなっている文法は次のページに解説があります。

  • オプショナル型 96ページ
  • 演算子の定義(== の定義など)81ページ
  • オプショナルチェーン 243ページ
  • クロージャとキャプチャ(参照)関係 310ページ
  • 遅延格納型プロパティ(lazy) 339ページ

正直、上記の書籍は Swift言語本の中では容易は部類ですが、それでもいきなり難しい話があったりして読み進めるのにそれなりの苦労が伴う書籍です。

しかし、現時点で日本語で詳しく説明してあり、また実行可能な例題が豊富な書籍は他にありませんので、ぜひこのような参考書を一冊携えられることを強く推奨します。


認識があっているか確認してほしい点
・左辺 Auth.auth().currentUser?.uid の値と右辺 uidの値が一致していればtrue そうでなければfalseになる。

これは、半分正解で半分間違です。
「半分正解で半分間違い」という表現は適切で無いと判断したので表現を変えます。
「両辺の値が一致してれば true という意味では正解だが、その結果は妥当と言えない場合がある」ということです。

後半でオプショナルチェインの話が出てきますが、オプショナルチェインの結果とある値を比較させるのは、可読性が低い表現ではないかと思います(これは、参考にされているテキストの問題ですが)。

仮に、左辺のオプショナルチェインの結果が niluid の値が nil だった場合、この判定式は true になりますが、本質的にそれは何を意味しているのかはこの表現だけではわかりません。

もちろん、uid はオプショナル値では無いということを確信できるのであれば問題はないのですが(ご提示いただいたコードから判断すると、uidString なので 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|nilnilの比較なのでtrue|

となります。
注意していただきたいのは、nilnil の比較は true だと横転です。

ちなみに、今回のコード

Swift

1var isCurrentUser: Bool { return Auth.auth().currentUser?.uid == uid }

ですが、左辺値がオプショナルチェインの結果、nil になり得ることにご注意ください(オプショナルチェインについては、先日ご説明したかとおもいます)。


ちなみに、振る舞いがわからない場合、Xcode のヘルプ機能を活用するのが一番手っ取り早いです。

Optionキーを押しながらドラッグし、わからない関数(演算子も含む)やプロパティにポインタを移動させると、? マークが出ることがあります。
これはオンラインヘルプがある、ということですので、クリックすることでオンラインヘルプを見ることができます。

英語ですが、コピーして翻訳させてみても良いでしょうし、ここからいくつかのキーワードを拾って検索するのも一つかと思います。

イメージ説明

投稿2021/02/24 05:14

編集2021/02/25 06:40
TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momokoko

2021/02/25 05:09

解説ありがとうございます。 取り急ぎお礼申し上げます。
momokoko

2021/02/25 05:39

自分の知識不足から来る初歩的な質問のような気がして恐縮ですが、回答の理解のために2点認識があっているか確認してほしいです。 右辺のuidがBool型となるのは以下の認識であっていますか。 -①--------------- let uid: String と宣言しているものの、 var isCurrentUser: Bool :となっているため その中のuidもBool型になる --------------- -②---------- let ア uid: String var isCurrentUser: Bool { return Auth.auth().currentUser?.イuid == ウuid } 右辺には、アのuidを代入している。 ①よりString型からBool型になっている。
TsukubaDepot

2021/02/25 06:41

(1)については、当初の説明が誤解を招く例題になっていました。 回答を修正しましたので、あらためて確認していただけますでしょうか。 (2)については、比較演算子の特徴(同じであれば true、違えば false)です。
momokoko

2021/02/27 07:42

コメントの返信ありがとうございます。 今更ですが、returnの中の{ Auth.auth().currentUser?.uid == uid }が条件式になっていたのですね。 普段のreturnの使い方と違うような気がして理解に戸惑いましたが、解説の中で腹落ちしました。 オンラインペルプ見るようになりました。今までjump to definitionのみの利用でしたがxcodeの使い方の幅が広がりました!ありがとうございます。 書籍については以前にご紹介頂いたときから探していますが、6000円は自分にとって高額でメルカリやラクマで買おうとしております。。
TsukubaDepot

2021/02/27 11:35

== は両辺の値が同じ場合に true を返す比較演算子ですね。 if a == b { 処理 } と考え方は同じです。 書籍ですが、私がリンクを貼った時にはまだ定価在庫があったのですが、現時点では無くなったみたいですね。 出版元も含め、大手はどこにも在庫がないみたいなので、適切な価格で買えるときに入手できると良いですね。
guest

0

実際に動作させてみればわかることだと思いますが、
なにをききたいんでしょうか。

投稿2021/02/23 23:30

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momokoko

2021/02/25 05:08

上記コードはUdemyで先生が書いているコードです。 エラーなく動いてはいますが、なぜ動いているのか理解できないところをこちらで質問させて頂いております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問