teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

記述を変更

2020/03/20 08:11

投稿

TsukubaDepot
TsukubaDepot

スコア5086

answer CHANGED
@@ -18,25 +18,34 @@
18
18
  ```
19
19
  と修正すればご希望の動作をすると思います。
20
20
 
21
+ ---
22
+
21
23
  起動時に
22
24
  ```swift
23
25
  if UserDefaults.standard.bool(forKey: "tutorialShown") == false{
24
26
  ```
25
27
  という行で`"tutorialShown"`というキーに紐づいた値を `Bool`値で調べています。
26
28
 
27
- 一方、初回起動時処理の中で同じキーにる書き込みは以下のようになっています。
29
+ `bool(forKey:)`というメソッドは、指定されたキーに紐づいた値に応じて`Bool`値を返すようになっています。
28
30
 
31
+ [bool(forKey:)](https://developer.apple.com/documentation/foundation/userdefaults/1416388-bool)
32
+
33
+ ドキュメントを読むと、
34
+
35
+ > This method automatically coerces certain ”truthy” values—such as the strings "true", "YES", and "1", and the numbers 1 and 1.0—to the Boolean value true. The same is true for certain ”falsy” values—such as the strings "false", "NO", and "0", and the numbers 0 and 0.0—which are automatically coerced to the Boolean value false.
36
+
37
+ とありました。
38
+
39
+ つまり、書き込み時に`"true"`や`"1"`あるいは数値型の'1'など、”真”として処理できる値が書き込んであれば`true`として扱いますが、それ以外だと`false`という扱いになってしまします。
40
+
41
+ 一方、書き込み時は
29
42
  ```swift
30
43
  let tutorial = "初期値"
31
44
  UserDefaults.standard.set(tutorial, forKey: "tutorialShown")
45
+ }else{
32
46
  ```
47
+ と文字型で書き込んでいます。なので、`bool(forKey:)`というメソッドで読み込むと`false`という結果しか得られないということになります。
33
48
 
34
- `tutorial`は`String`型ですが、書き込むときは`Any?`型として処理されます。
49
+ 質問者さんの先日の質問を拝見したところ、`Bool`型での処理を提案されていましたので、ここでは`Bool`型での読み書きに統一するこをお勧めします。
35
50
 
36
- つまり、書き込むときには`Any?`型、読み込むときには`Bool`型として処理しようとしていますから、型が一致せず思ったとおりの動作をしていないと考えられます。
37
-
38
- ちなみに、`Any?`型で記録された`"初期値"`という値を`Bool`型で読み込むと、常に`false`という結果となるため、常に初期画面が表示されてしまいます。
39
-
40
- 読み書きの型を一致させれば良いのですが、質問者さんの先日の質問を拝見したところ、`Bool`型での処理を提案されていましたので、ここでは`Bool`型での読み書きに統一することをお勧めします。
41
-
42
- また、先日の質問ではhoshi-takanoriさんが詳細に説明されていますから、そちらを再度よく確認されてはいかがでしょうか。
51
+ また、先日の質問ではhoshi-takanoriさんが引用も含めて詳細に説明されていますから、そちらを再度よく確認されてはいかがでしょうか。