💬

型の変換

2023/02/10に公開

プログラミングにおいて型の変換は頻繁に行われており、非常に重要な要素でその勘所を説明します。キャストではありません。Swiftで説明します。

対象

プログラミングを始めて0〜2年目くらいの人

型の変換とは

すでに変数に入っている型から別のほしい型に変えたいときに、型の変換します。例えば、Int型からString型に変えたいという状況です。実際のコードとして、Int型からString型の変換は次のように書きます。

let s: String = String(123)

Swiftでは多くの場合は、変換したい型でイニシャライズをすることで型を変換できます。まず、この方法を試しましょう。ただし、String型からInt型のようにOptional型になる場合があります。

let i: Optional<Int> = Int("123") // Optional(123) に型が変換される

String型は数字以外の文字("a", ""等)のときに、Int型に変換することができません。Optional型になっているときは型の変換が失敗することがあることを表しています。失敗したときの扱いは場合によります。それぞれ、最適なのは何かを考えて実装してください。

String型はInt型に変換するときに失敗する可能性があります。String型の中身が明らかに数字であっても取り扱いを難しくします。Int型は数字しか常に入れることができないので、数字であることがわかっているならInt型で扱いましょう。

プロパティやメソッドを使った型の変換

URL型からString型にした場合はプロパティで変換します。URL型には複数のプロパティがあり、URLの一部だけ変換することもできます。

// String型からURL型にする
let url: Optional<URL> = URL(string: "https://zenn.dev/")
// URL型からString型にする
let s: String = url.absoluteString

Formatterを使った型の変換

Date型からString型またはその逆を行う場合は多くの言語でFormatterを使って変換を行います。金額や氏名はFormatterを使って文字列に変換します。

// Date型をString型に変換する
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXXXX"
let s = formatter.string(from: Date()) // "2018-09-18T02:00:00Z"
// String型をDate型に変換する
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXXXX"
let s = formatter.date(from: "2018-09-18T02:00:00Z") // Optional<Date>

Formatterを使うときの注意といて、String型にするときに元に戻せる値になっているかを注意する必要がある。Date型から "y年M月d日" でフォーマットしたら時分秒の情報が失われる。このフォーマットを行った場合にはDate型に戻すことはできない。Date型とString型を相互に型変換したい場合は、それができるフォーマットを使ってください。

Date型の状態で取り扱い、ユーザーに見せる瞬間になった時にユーザーに見せる用のフォーマットを使ってString型に変換すると多くのうまくいきます。

他にも色々

  • Encoder、Decoderを使った変換
  • 配列やモナド的な変換

変換の仕方はたくさんあるので、思いつかないときはGoogleで検索したり、人に聞きましょう。

複数回の変換

大抵の場合は一度で目的の型になることはありません。複数回の型の変換を行なって目的の型になることがほとんどです。失敗することなく変換できる型の選択は、ある程度は経験が必要です。人のコードを読みましょう。

Discussion