整数を取り扱う場合、もしそれらが絶対に負の数値にならないことがわかっていたとしても、基本的には Int型 を使うよう心がけること。
※ 符号なし(正)の整数型として UInt が存在する。
整数を扱う場合に Int型 を使うように心がけていれば、コード内に生じるであろう整数リテラル値を扱う際に不要な問題を抱え込まなくてよくなるため。
Int型 以外が必要な場面とは、外部ソースが桁数に厳密である場合や、数値を厳格に管理して最大限の最適化を行いたい場合が想定される。
整数型変換
定数・変数に格納できる数値の範囲は、その型によって異なる。
例えば Int8型 が対応する範囲が -128 から 127 なのに対し、 UInt8型 は 0 から 255 となる。
その定数・変数に与えられた型が対応する範囲に収まらない数値を格納しようとすると、エラーになってしまう。
let cannotBeNegative: UInt8 = -1
// UInt8型は負の数値に対応していないためエラーになる。
let tooBig: Int8 = Int8.max + 1
// .maxオプションがInt8の最大値127を提供。
// +1 で 128 となる。
// Int8 対応範囲を超過した数値なのでエラーになる。
Int や Int8 のような様々な数値型はそれぞれが異なる対応範囲を持つため、異なる数値型間で作業をする場合は作業毎に型変換を行なう必要がある。
型変換を行うには、既存の定数・変数を使って変換したい型を初期化する必要がある。
下記例では、2000 という数値を持つ UInt16型の定数twoThousandと、1 という数値を持つ UInt8型の定数oneを足し算したいケースを表す。
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
2つの定数 twoThousand と one は最初それぞれ異なる型で宣言されているが、one が UInt16 に型変換され両定数が同じ型で統一されているので足し算が成り立つ。
型名(値) は Swift における型イニシャライザに初期値を渡す文法である。
実際には、上記例でいうと UInt16 は UInt8型 の値を受け入れるイニシャライザを持っているので UInt8型 の 1 を受け入れて新しい UInt16型 の 1 を生成に成功している。
逆にいうと、 UInt16 が対応したイニシャライザを持っていない場合変換は失敗する。
イニシャライザの種類は拡張可能である。これについては Extensions の項目で解説されている。
整数型と小数点型での変換
整数型と小数点型を同時に扱いたい場合は必ず型変換が必要になる。
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi は 3.14159 になる。
// 初期値が Double だったため、型推測から Pi は Double型になる。
定数 three は Int型 として宣言されているが Double型 の値生成に使われているため、足し算の項が全て Double になり式が成り立つ。
小数点型(Double, Float)から整数型への変換も可能。
let integerPi = Int(Pi)
// integerPi は 3 になる。
// 初期値が整数型のため、integerPi の型も Int型 になる。
小数点型から整数型へ変換が生じた場合、小数点以下は切り捨てられる。4.75 は 4 になり、 -3.9 は -3 になる。
注意
数値型の定数・変数と数値リテラルの扱いには差異がある。
数値リテラル 3 は直接 0.14159 と計算が行える。
これは、数値リテラルは明確な型を持たないため。