この記事ではSwift
の基本的な型である、数値型
についての基本事項を解説していきます。
プログラミング初心者の人も、他の言語をやっていてSwift
は初心者という人にもわかるように説明していきたいと思います。
この記事はこちらのシリーズの文法編の記事になります。
サンプルコードも交えながら説明していきますので、Playground
を使って実際に手を動かしながら行えると効率よく学習できるかなと思います。
数値型とは
数値型は、名前の通り数値を表します。
数値を表す型として、これまでの記事でもInt型
が何回か出てきましたが、Int型
の他にも数値を表す方はいくつもあります。
それらをまとめたものが数値型です。
Swift
の数値型を大きく分類すると整数型
と浮動小数点型
に分けることができます。
整数型
整数型
は、整数を表す型です。
よく知られているInt型
は整数型
の代表例です。
他にも符号がない整数型であるUInt型
や、定義できる値の範囲別にInt8型
,Int16型
,Int32型
,Int64型
,UInt8型
,UInt16型
,UInt32型
,UInt64型
があります。
これらについては、この記事の後半で触れていきますが、基本的にはInt型
の他にもあったりするよっていうのを頭の片隅においておいて、Int型
をメインで使うかたちで問題ありません。
浮動小数点型
浮動小数点型
とは、浮動小数点方式で小数を表す型です。
主な浮動小数点型として、Float型
とDouble型
があります。
コンピューターの世界では数値は2進数で扱っていて、2進数では小数を扱うのが難しいです。そこで1.0111×22
のように分けることで扱いやすくしたのが浮動小数点方式
です。
Float型
とDouble型
は表現できる値の範囲と精度が異なります。
Double型
のほうが範囲が広くて、精度が高いので、計算により発生する誤差が心配な場合はDouble型
を使い、普段はFloat型
を使うというかんじで十分かと思います。
型を明示せずに小数値を代入した場合には、型推論ではデフォルトでDouble型
となります。
Float型
を宣言する場合は、型アノテーションを付けましょう。
let a = 1.0 //Double型
let b: Float = 1.0 //Float型
型アノテーションとはlet b: Float
の: Float
の部分で型を明示的にする際に使用します。
数値型どうしの型変換
Swift
では、同じ数値型であったとしても、型が異なった場合に計算や比較などできません。
なので型変換の方法をしっかりおさえておきましょう。
以下のように型名(数値)
というようにすることで型変換を行うことができます。
let a: Int = 1
let b: Float = a //コンパイルエラー
let c: Float = Float(a) //Float型
let d: Double = Double(a) //Float型
型名()
で実行されるのはイニシャライザというもので()
の中に渡した値をその型の値として生成し初期化します。なので正確には変換というよりは初期化しています。
小数を表すFloat型
から整数を表すInt型
のように変換する場合は、小数は切り捨てられます。
このように範囲や精度が広いものから狭いものへ変換する場合は、変換後に合わせて端数の処理が行われます。
let a: Float = 3.14
let b: Int = Int(a) //3
let c: Double = 1.23456789
let d: Float = Float(c) //1.234568
数値型の計算方法
数値型は、数値であるので、足し算、引き算、掛け算、割り算の四則計算ができるのと、余りの計算が用意されています。
//足し算
1 + 1 //2
//引き算
2 - 1 //1
//掛け算
3 * 2 //6
//割り算
9 / 3 //3
10 / 3 //3 余りは切り捨てられる
//余り
10 / 3 //1
変数の場合、=
と組み合わせることで、計算と代入を同時に行えます。
例えば足し算であれば、a = a + 1
というような計算がa += 1
と書くことができます。
//足し算
var a = 1
a += 2 //3
//引き算
var b = 1
b -= 5 //-4
//掛け算
var c = 3
c *= 2 //6
//割り算
var d = 10
d /= 3 //3
//余り
var e = 10
e %= 3 //1
数値型
であったとしても、異なる型同士の計算はコンパイルエラーになってしまいます。
その場合は型変換を行って型を一致させる必要があります。
let a: Int = 1
let b: Float = 1.0
a + b //コンパイルエラー
a + Int(b) //2
数値型の比較
数値どうしの大小関係や一致するかどうかをBool値
として返してくれます。
Bool値
に関しては、こちらの記事で解説していますので、まだよくわかっていない人は参考にしてください。
大小関係や一致するかどうかを調べる方法として以下が使えます。
== | 左辺と右辺が一致すればtrue |
---|---|
!= | 左辺と右辺が一致しなければtrue |
> | 左辺が右辺より大きければtrue |
>= | 左辺が右辺以上であればtrue |
< | 右辺が左辺より大きければtrue |
<= | 右辺が左辺以上であればtrue |
1 == 2 //false
1 != 2 //true
1 > 2 //false
1 >= 2 //false
1 < 2 //false
1 <= 2 //false
先程の計算のところでもあったように比較する2つの値の型が一致しない場合にはコンパイルエラーになってしまうので、一致するように型変換を行う必要があります。
let a: Float = 1.0
let b: Double = 1.0
a == b //コンパイルエラー
a == Float(b) //true
さらに理解したい人向け
ここまで数値型の基本事項を解説していきました。
初心者の方であれば、数値型に関してはここまでの内容をおさえておけば十分かと思います。
ここからはさらに理解したい人向けの内容を紹介していきます。
数値の高度な計算
コアライブラリであるFoundation
を読み込むことで、三角関数や対数などといった高度な計算を利用することができます。
import Foundation
sin(1.0)
log(1.0)
数値型の値の表現できる範囲
数値型は型によって値の表現できる範囲が異なります。
Int型
は
32bitプラットフォーム
では32bit
64bitプラットフォーム
では64bit
で定義されています。
iPhone
ではiPhone5
以前が32bitプラットフォーム
でiPhone5S
が64bitプラットフォーム
となっています。
コンピューターの世界では、データは2進数
で扱います。
32bit
というのは、2進数
での32桁
ということで、Int型
の場合、マイナスの値も取れるので最初の1桁
は、符号を表すために用います。残りの31桁
で数値を表すので10進数
にすると2の31乗で2147483648
です。
したがって、32bit
の場合に値の表現できる範囲は、0も考慮して
-2,147,483,648 〜 2,147,483,647
となります。
同様にして64bit
の場合は、
-9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807
です。
ゲームでカンスト値が2,147,483,647
になることがちょくちょくあったりするのはこういう理由だったわけです。
この記事の前半で、Int8型
,Int16型
,Int32型
,Int64型
という型もあることに触れましたが、Int
の後に続く数字はbit
数を表していて、先ほどと同様に考えることでそれぞれの値の表現できる範囲がわかります。
型 | 最小値 | 最大値 |
Int8 | -128 | 127 |
Int16 | -32,768 | 32,767 |
Int32 | -2,147,483,648 | 2,147,483,647 |
Int64 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
こちらは、計算することでもわかりますが、型名に.max
,.min
をつけることでもわかるようになっています。
Int8.max //127
Int8.min //-128
Int型
のいろいろなbit数
別の型を紹介しましたが、基本的にはInt型
を用いる形で問題ないかと思います。
非負整数を表すUInt型
UInt型
は非負整数を表します。すなわち0以上の整数です。
「U」は「Unsigned(符号なし)」という意味から来ているようです。
UInt型
もInt型
と同様に、
32bitプラットフォーム
では32bit
64bitプラットフォーム
では64bit
で定義されています。
UInt8型
,UInt16型
,UInt32型
,UInt64型
という型も用意されていて値の表現できる範囲は以下のようになっています。
型 | 最小値 | 最大値 |
UInt8 | 0 | 255 |
UInt16 | 0 | 65,535 |
UInt32 | 0 | 4,294,967,295 |
UInt64 | 0 | 18,446,744,073,709,551,615 |
UInt(32bit) | 0 | 4,294,967,295 |
UInt(64bit) | 0 | 18,446,744,073,709,551,615 |
UInt型に関しては、Appleの公式のドキュメントにこのような記述がありました。
UseUInt
only when you specifically need an unsigned integer type with the same size as the platform’s native word size. If this isn’t the case,Int
is preferred, even when the values to be stored are known to be nonnegative. A consistent use ofInt
for integer values aids code interoperability, avoids the need to convert between different number types, and matches integer type inference, as described in Type Safety and Type Inference.
こちらにあるように、たとえ格納される値がマイナスではない値だったとしてもInt
を用いるべきで、表現できる値の範囲が同じ場合にのみUInt
を用いるべきと書かれています。
Int
を一貫して使用することで、コードの相互運用性が向上するのに加えて、型変換の必要性もなくなるからです。
まとめ
今回は、数値型
に関してまとめていきました。
数値型
は基本的な型の中でもよく使う型であるので、しっかり基本を押さえておきましょう。
Swift
の入門記事に関してはこちらにまとめていますので参考にしてみてください。