Swift

【swift入門 文法編】数値型(Int型、Float型、Double型)をマスターしよう

この記事ではSwiftの基本的な型である、数値型についての基本事項を解説していきます。

プログラミング初心者の人も、他の言語をやっていてSwiftは初心者という人にもわかるように説明していきたいと思います。

この記事はこちらのシリーズの文法編の記事になります。

〜初心者でもわかるswift入門〜基本文法からiOSアプリを開発するまでこのシリーズではプログラミング初心者の人や、swiftを初めて触れる人、やってみたもののよくわからないという人向けに、swiftの基本文法から実際に動くiOSアプリをXcodeで開発するところまでを解説します。...

数値型とは

数値型は、名前の通り数値を表します。
数値を表す型として、これまでの記事でも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値に関しては、こちらの記事で解説していますので、まだよくわかっていない人は参考にしてください。

【Swift入門 文法編】Bool型(真理値)をマスターしようこの記事ではSwiftの基本的な型である、Bool型についての基本事項を解説していきます。プログラミングが初心者も、他の言語をやっていてSwiftは初心者という人にもわかるように説明していきたいと思います。...

大小関係や一致するかどうかを調べる方法として以下が使えます。

== 左辺と右辺が一致すれば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プラットフォームiPhone5S64bitプラットフォームとなっています。

コンピューターの世界では、データは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の公式のドキュメントにこのような記述がありました。


Use 
UInt 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 of Int 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の入門記事に関してはこちらにまとめていますので参考にしてみてください。

〜初心者でもわかるswift入門〜基本文法からiOSアプリを開発するまでこのシリーズではプログラミング初心者の人や、swiftを初めて触れる人、やってみたもののよくわからないという人向けに、swiftの基本文法から実際に動くiOSアプリをXcodeで開発するところまでを解説します。...