Swift

Swift:AnyObjectのデータタイプ?

AnyObjectのデータタイプを調べる方法を見直しました。

まず、テストプログラムの結果です。左側の項番は気にしないでください。その次の1〜4とa〜mは一応意味があります。サンプルプログラムのソースコードはここにあります。サンプルコードは左側をクリックすればデバッグ中のコードの実行、右側に番号を入れれば各項目別コードの実行をするように変更しました。全く整理していないので、乱雑なままです。

手順的には、

0. nilを対象外として外す
1. 配列か否かを切り分ける
2.次に配列でない場合、文字列か数値かを切り分ける
3. 最後に、AnyObjectが小数点を含むか否かでIntとDoubleを切り分ける

となりました。この3.は少し生臭く、自分の場合、95%くらいの変数のデータタイプが想定できるので、プログラムの中で読み込んだファイルからその95%のデータタイプが正しいことを再度確認し、データタイプが不明である残りの5%を補足するようにしたので、まあ、これでいいかなという感じになりました。

配列もその構成要素を上記の手順で変換できます。ただし、配列の構成は、NSArrayで同じデータタプだけで構成されているものになります。

ここでやりたかったことは、AnyObjectで入ってくる中身をString / Double / Int、配列(String / Double / Int)にそれぞれ切り分け、対応する文字列に変換する処理することです。以前記載した文字列からIntかDoubleに変換する処理とは、少し違います。

1. 1. String(1234.0)=1234.0
2. 2. String(1234)  =1234 1と2は区別がつく
3. 3. String(wObject)=1234
4. 4. String(wObject)=1234 3と4は区別がつかない。
5. wObject=1234
6. wObject=1234
7. wObj String=1.234———————–
8. a. wObj as? Double!=nil ->nilのとき、IntでもDoubleでもない。****1
9. b. wObj as? Int!   =nil    ->nilのとき、IntでもDoubleでもない。****1
10. wObj Int=54321————————
11. c. wObj as? Double!=Optional(54321.0) -> nilでないとき、IntかDoubleである。
12. d. wObj as? Int!   =Optional(54321)   -> nilでないとき、IntかDoubleである。
13. e. String(wObj as! Double))     =54321.0 ->nilでないならDoubleかIntである。
14. f. String(wObj as! Int   ))     =54321 ->nilでないならDoubleかIntである。
15. g. Int(String(wObj as! Double)) =nil ->nilでもIntと断定できない。
16. wObj Int=54321———————–
17. h. wObj as? Double!=Optional(54321.0) ->Doubleでキャストすれば.0になる。
18. i. wObj as? Int!   =Optional(54321)    ->Intでキャストすれば.0がつなない。
19. j. String(wObj as! Double))     =54321.0 ->nilでないならDoubleかIntである。
20. k. String(wObj as! Int   ))     =54321 ->nilでないならDoubleかIntである。
21. l. Int(String(wObj as! Double)) =nil ->nilでもIntと断定できない。
22. wObj=nil——————————
23. m. wObj as? Double!=Optional(nil) ->nilならDoubleでない。当然、Intでもない。)
24. wObj Double=12345.678————
25. wObj as? Double!!=Optional(12345.678) -> nilでないとき、IntかDoubleである。****2
26. wObj as? Int     =Optional(12345)     -> nilでないとき、IntかDoubleである。****2
27. String(wObj as! Double))     =12345.678 -> nilでないとき、IntかDoubleである。****2?
28. String(wObj as! Int   ))     =12345 -> nilでないとき、IntかDoubleである。****2?
29. Int(String(wObj as! Double)) =nil ->nilでもIntと断定できない。

実際のプログラムは次のようになりました。

Screenshot 2016-01-22 18.23.32

Categories: Swift, 技術