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

回答編集履歴

2

追記とtype(of:)を修正

2019/12/03 04:09

投稿

momon-ga
momon-ga

スコア4828

answer CHANGED
@@ -7,11 +7,12 @@
7
7
  まず、値の静的タイプの説明として、「既知のコンパイル時の値の型です。」とありますが、これが何を示しているのかが分からないです。そして、動的なタイプの説明として、「具体的な型のサブタイプ」とありますが、こちらの意味もよく分からないです
8
8
 
9
9
   
10
- 静的タイプ(基地のコンパイル時の型)について
10
+ 静的タイプ(既知のコンパイル時の型)について
11
11
 
12
12
  > 「既知のコンパイル時の値の型です。」
13
13
 
14
14
  ソースコードに定義されている型のことです。
15
+ 動的タイプは実行時の実態の型です。
15
16
 
16
17
  ```swift
17
18
  func printInfo(_ value: Any) {
@@ -30,7 +31,7 @@
30
31
  このcount変数printInfo関数へ渡していますが
31
32
 
32
33
  printInfo関数内での仮引数、value の静的タイプはAnyです。
33
- そして、typeof取得した動的タイプはIntです。
34
+ そして、type(of:)で取得した動的タイプはIntです。
34
35
 
35
36
  質問者さんのコードでいうと
36
37
  ```Swift
@@ -51,4 +52,12 @@
51
52
 
52
53
  > test1はanyになるのではないかと思うのですが
53
54
 
54
- anyになると思っていることそのものが勘違いで、本来の型であるStringを取得することが正しいです。
55
+ Anyになると思っていることそのものが勘違いで、本来の型であるStringを取得することが正しいです。
56
+
57
+ 静的?動的?って、混乱してるかもしれませんが、単純な例でいうと。
58
+ ソースでStringって定義したから実態がStringになるわけじゃないんです。
59
+ 以下は、Stringっていう文字がでてこないですが、"sample"の実態はStringなので、type(of:)の結果はStringです。
60
+ ```Swift
61
+ let test1: Any = "sample"
62
+ print("type Of test1: (type(of:test1))")
63
+ ```

1

コメント欄への対応

2019/12/03 04:09

投稿

momon-ga
momon-ga

スコア4828

answer CHANGED
@@ -1,1 +1,54 @@
1
- [公式ドキュメント](https://developer.apple.com/documentation/swift/2885064-type)に書いてあります
1
+ [公式ドキュメント](https://developer.apple.com/documentation/swift/2885064-type)に書いてあります
2
+
3
+ 公式ドキュメントのここが、わからないは、質問に普通に追記でいいと思いますよ。
4
+ むしろ、コメントは検索対象にならないので、せっかくの書いてもらったのに質問が埋もれます。
5
+
6
+ > 「このtype(of:)関数を使用して、特に動的タイプが静的タイプと異なる場合に、値の動的タイプを見つけることができます。値の静的な型は、既知のコンパイル時の値の型です。値の動的な型は、実行時の値の実際の型であり、具体的な型のサブタイプになる場合があります。」
7
+ まず、値の静的タイプの説明として、「既知のコンパイル時の値の型です。」とありますが、これが何を示しているのかが分からないです。そして、動的なタイプの説明として、「具体的な型のサブタイプ」とありますが、こちらの意味もよく分からないです
8
+
9
+  
10
+ 静的タイプ(基地のコンパイル時の型)について
11
+
12
+ > 「既知のコンパイル時の値の型です。」
13
+
14
+ ソースコードに定義されている型のことです。
15
+
16
+ ```swift
17
+ func printInfo(_ value: Any) {
18
+ let t = type(of: value)
19
+ print("'(value)' of type '(t)'")
20
+ }
21
+
22
+ let count: Int = 5
23
+ printInfo(count)
24
+ // '5' of type 'Int'
25
+ ```
26
+
27
+ countは、静的タイプはIntです。
28
+ 動的なタイプは5なのでIntです。
29
+
30
+ このcount変数printInfo関数へ渡していますが
31
+
32
+ printInfo関数内での仮引数、value の静的タイプはAnyです。
33
+ そして、typeofでで取得した動的タイプはIntです。
34
+
35
+ 質問者さんのコードでいうと
36
+ ```Swift
37
+ let test2: String = "sample"
38
+ print("type Of test2: (type(of:test2))")
39
+ let test1: Any = test2 as Any
40
+ print("type Of test1: (type(of:test1))")
41
+ ```
42
+ test2のStringと、test1のAnyの部分が静的タイプです。
43
+
44
+ > 「具体的な型のサブタイプ」
45
+
46
+ 端的にいっちゃうと、ダウンキャストしたものです。
47
+ 関数の引数は汎用的にするためAnyとまではいかないですが、親の型を定義(静的タイプ)とすることが多いと思います。
48
+ 元の型でなく、実際のインスタンスである、継承した型(サブタイプ)を取得するということです。
49
+
50
+ 大元の質問に戻ると
51
+
52
+ > test1はanyになるのではないかと思うのですが
53
+
54
+ anyになると思っていることそのものが勘違いで、本来の型であるStringを取得することが正しいです。