回答編集履歴

2

追記とtype(of:)を修正

2019/12/03 04:09

投稿

momon-ga
momon-ga

スコア4826

test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
   
18
18
 
19
- 静的タイプ(基地のコンパイル時の型)について
19
+ 静的タイプ(既知のコンパイル時の型)について
20
20
 
21
21
 
22
22
 
@@ -25,6 +25,8 @@
25
25
 
26
26
 
27
27
  ソースコードに定義されている型のことです。
28
+
29
+ 動的タイプは実行時の実態の型です。
28
30
 
29
31
 
30
32
 
@@ -62,7 +64,7 @@
62
64
 
63
65
  printInfo関数内での仮引数、value の静的タイプはAnyです。
64
66
 
65
- そして、typeofで取得した動的タイプはIntです。
67
+ そして、type(of:)で取得した動的タイプはIntです。
66
68
 
67
69
 
68
70
 
@@ -104,4 +106,20 @@
104
106
 
105
107
 
106
108
 
107
- anyになると思っていることそのものが勘違いで、本来の型であるStringを取得することが正しいです。
109
+ Anyになると思っていることそのものが勘違いで、本来の型であるStringを取得することが正しいです。
110
+
111
+
112
+
113
+ 静的?動的?って、混乱してるかもしれませんが、単純な例でいうと。
114
+
115
+ ソースでStringって定義したから実態がStringになるわけじゃないんです。
116
+
117
+ 以下は、Stringっていう文字がでてこないですが、"sample"の実態はStringなので、type(of:)の結果はStringです。
118
+
119
+ ```Swift
120
+
121
+ let test1: Any = "sample"
122
+
123
+ print("type Of test1: (type(of:test1))")
124
+
125
+ ```

1

コメント欄への対応

2019/12/03 04:09

投稿

momon-ga
momon-ga

スコア4826

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