回答編集履歴

2

誤解を招く部分を修正した。

2021/02/25 06:40

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -1,3 +1,107 @@
1
+ まず、コメントへの回答です。
2
+
3
+
4
+
5
+ > 右辺のuidがBool型となるのは以下の認識であっていますか。
6
+
7
+ > -①---------------
8
+
9
+ > let uid: String
10
+
11
+ > と宣言しているものの、
12
+
13
+ > var isCurrentUser: Bool :となっているため その中のuidもBool型になる
14
+
15
+
16
+
17
+
18
+
19
+ これは私の説明が適切でありませんでした。
20
+
21
+ 申し訳ありません。
22
+
23
+
24
+
25
+ `uid` は `String` なので、右辺値は当然 `String` になります。
26
+
27
+
28
+
29
+ > -②----------
30
+
31
+ > let ア uid: String
32
+
33
+ > var isCurrentUser: Bool { return Auth.auth().currentUser?.イuid == ウuid }
34
+
35
+ > 右辺には、アのuidを代入している。
36
+
37
+ > ①よりString型からBool型になっている。
38
+
39
+
40
+
41
+ 下記の文章中で、`String?` 型どうしの比較(オペレータ、演算子)の定義について説明してありますが、
42
+
43
+
44
+
45
+ ```Swift
46
+
47
+ static func == (lhs: String?, rhs: String?) -> Bool
48
+
49
+ ```
50
+
51
+
52
+
53
+ という具合に、`String?` と `String?` の比較をした結果が `Bool` 型で戻ります。
54
+
55
+ なので、当然戻り値は `Bool` 型となります(比較結果の詳しい表は下記をご参照ください)
56
+
57
+
58
+
59
+ ちなみに、オプショナル型に非オプショナル型を代入することは可能です。
60
+
61
+ なので、`==`演算子の右辺値は `String? (Optional<String>)` となっていますが、`String` 型として比較させることは問題ありません。
62
+
63
+
64
+
65
+ ただし、逆(つまり`String`に`Optional<String>`を代入すること)はできません。
66
+
67
+
68
+
69
+ この辺りの説明については、回答の範疇を超えそうですし、きちんとした参考書を読めばわかることなので、ぜひ参考書の購入をご検討ください(掲示板やネット記事の断片的な情報では正しい知識を得ることは難しいです)。
70
+
71
+
72
+
73
+ 日本語として記述された Swift 文法書のうち、現時点で一番詳しく、また広く網羅されている本して下記の書籍があります。
74
+
75
+
76
+
77
+ - [詳解 Swift 第5版](https://amzn.to/3aSKwK4)
78
+
79
+
80
+
81
+ たとえば、これまでの一連の回答のうち、キーワードとなっている文法は次のページに解説があります。
82
+
83
+ - オプショナル型 96ページ
84
+
85
+ - 演算子の定義(`==` の定義など)81ページ
86
+
87
+ - オプショナルチェーン 243ページ
88
+
89
+ - クロージャとキャプチャ(参照)関係 310ページ
90
+
91
+ - 遅延格納型プロパティ(`lazy`) 339ページ
92
+
93
+
94
+
95
+ 正直、上記の書籍は Swift言語本の中では容易は部類ですが、それでもいきなり難しい話があったりして読み進めるのにそれなりの苦労が伴う書籍です。
96
+
97
+
98
+
99
+ しかし、現時点で日本語で詳しく説明してあり、また実行可能な例題が豊富な書籍は他にありませんので、ぜひこのような参考書を一冊携えられることを強く推奨します。
100
+
101
+
102
+
103
+ ---
104
+
1
105
  > 認識があっているか確認してほしい点
2
106
 
3
107
  > ・左辺 Auth.auth().currentUser?.uid の値と右辺 uidの値が一致していればtrue そうでなければfalseになる。
@@ -20,7 +124,7 @@
20
124
 
21
125
 
22
126
 
23
- もちろん、`uid` はオプショナル値では無いということを確信できるのであれば問題はないのですが、それを確信できるのはこの式を記述した人だけなので(ある変数がオプショナル値なのか否かを見ただけで判断する方法はないため)、そういう意味で適切ではないし、可読性も低いと考えています。
127
+ もちろん、`uid` はオプショナル値では無いということを確信できるのであれば問題はないのですが(ご提示いただいたコードから判断すると`uid` は `String` なので `nil` はとりえないことはわかりますが)、それを確信できるのはこの式を記述した人だけなので(ある変数がオプショナル値なのか否かを見ただけで判断する方法はないため)、そういう意味で適切ではないし、可読性も低いと考えています。
24
128
 
25
129
 
26
130
 
@@ -30,15 +134,19 @@
30
134
 
31
135
 
32
136
 
33
- **注意していただきたいのは、`Optional<Bool>` 型と `Bool` 型の比較を行なっている点**です。
137
+ ~~注意していただきたいのは、`Optional<Bool>` 型と `Bool` 型の比較を行なっている点です。~~
138
+
34
-
139
+ **注意していただきたいのは、`Optional<String>` 型と `String` 型の比較を行なっている点**です。
140
+
35
-
141
+ (以下適宜変更しています)
36
-
142
+
143
+
144
+
37
- `==`演算子の両辺が `Bool` 型であれば、単に両辺の値を比較し、同じであれば`true`, 違えば`false`になります。
145
+ `==`演算子の両辺が `String` 型であれば、単に両辺の値を比較し、同じであれば`true`, 違えば`false`になります。
38
-
39
-
40
-
146
+
147
+
148
+
41
- しかしこの場合、片方が `Optinal<Bool>` (`Bool?`)型のため、比較方法が少し異なってきます。
149
+ しかしこの場合、片方が `Optinal<String>` (`String?`)型のため、比較方法が少し異なってきます。
42
150
 
43
151
 
44
152
 
@@ -50,23 +158,29 @@
50
158
 
51
159
  Declaration
52
160
 
161
+
162
+
53
163
  ```Swift
54
164
 
55
- static func == (lhs: Bool?, rhs: Bool?) -> Bool
165
+ static func == (lhs: String?, rhs: String?) -> Bool
56
-
57
- Discussion
58
166
 
59
167
  ```
60
168
 
169
+ > Discussion
170
+
171
+
172
+
61
173
  > 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.
62
174
 
63
175
 
64
176
 
65
- 後半に、**the comparison returns false if only one of the arguments is nil** とありますが、これは比較しようとしている値の片方が `nil` である場合、`false` が戻る、という意味です。
177
+ 後半に、**Conversely, the comparison returns false if only one of the arguments is nil** とありますが、これは比較しようとしている値の片方が `nil` である場合、`false` が戻る、という意味です。
66
-
67
-
68
-
178
+
179
+
180
+
69
- なので、この演算子の振る舞いを整理すると
181
+ なので、この演算子の振る舞いを整理すると次のようになります。
182
+
183
+ ここでは、説明を簡易にするため、右辺値と左辺値に与える値は固定した文字列、もしくは `nil`とします。
70
184
 
71
185
 
72
186
 
@@ -74,21 +188,17 @@
74
188
 
75
189
  |:====|:====|:===|
76
190
 
77
- |true|false|false|
191
+ |`ABC`|`DEF`|両辺は違う文字列なので`false`|
78
-
192
+
79
- |false|true|false|
193
+ |`DEF`|`ABC`|両辺は違う文字列なので`false`|
80
-
194
+
81
- |true|ture|true|
195
+ |`ABC`|`ABC`|両辺は同じ文字列なので`true`|
82
-
196
+
83
- |nil|false|false|
197
+ |`nil`|`ABC`|`nil`と文字列の比較なので`false`|
84
-
85
- |nil|true|false|
198
+
86
-
87
- |false|nil|false|
199
+ |`ABC`|`nil`|文字列と`nil`の比較なので`false`|
88
-
89
- |true|nil|false|
200
+
90
-
91
- |nil|nil|true|
201
+ |`nil`|`nil`|`nil`と`nil`の比較なので`true`|
92
202
 
93
203
 
94
204
 
@@ -130,4 +240,4 @@
130
240
 
131
241
 
132
242
 
133
- ![イメージ説明](70ae66d9916f853a8a30aacaf894fcc7.png)
243
+ ![イメージ説明](bbc4f2307b40b44c6fe60dcdc6357a15.png)

1

表現の変更

2021/02/25 06:40

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -4,7 +4,29 @@
4
4
 
5
5
 
6
6
 
7
- これは、半分正解で半分間違です。
7
+ ~~これは、半分正解で半分間違です。~~
8
+
9
+ 「半分正解で半分間違い」という表現は適切で無いと判断したので表現を変えます。
10
+
11
+ 「両辺の値が一致してれば `true` という意味では正解だが、その結果は妥当と言えない場合がある」ということです。
12
+
13
+
14
+
15
+ 後半でオプショナルチェインの話が出てきますが、オプショナルチェインの結果とある値を比較させるのは、可読性が低い表現ではないかと思います(これは、参考にされているテキストの問題ですが)。
16
+
17
+
18
+
19
+ 仮に、左辺のオプショナルチェインの結果が `nil`、 `uid` の値が `nil` だった場合、この判定式は `true` になりますが、本質的にそれは何を意味しているのかはこの表現だけではわかりません。
20
+
21
+
22
+
23
+ もちろん、`uid` はオプショナル値では無いということを確信できるのであれば問題はないのですが、それを確信できるのはこの式を記述した人だけなので(ある変数がオプショナル値なのか否かを見ただけで判断する方法はないため)、そういう意味で適切ではないし、可読性も低いと考えています。
24
+
25
+
26
+
27
+ 以下本文です。
28
+
29
+ ---
8
30
 
9
31
 
10
32