[Swift 基本の型 第2回] 数値型

f:id:KAFAppFactory:20200505102702j:plain

Swiftの基本の型 第2回として、下記の「Swift実践入門」を参考に、数値型について学習したので、備忘録としてまとめます。

gihyo.jp

数値型とは、その名の通り数値を表す型です。 数値を表すリテラルを数値リテラルと言い、数値リテラルには整数リテラル浮動小数リテラルがあります。
例 )
123 ・・・ 数値リテラル
1.0 ・・・ 浮動小数リテラル

整数リテラルのデフォルトの型はInt型であり、他の型として認識されない場合は型推論により、Int型の値を返します。
let a = 123 // Int型

浮動小数リテラルのデフォルトの型はDouble型であり、他の型として認識されない場合は型推論により、Double型を返します。
let b = 1.0 // Double型

数値型の種類
Swiftの数値型は大きく分類すると、整数型浮動小数点型の2つに分けられます。

整数型

整数型は整数を表す型であり、代表的な整数型はInt型です。
これは勉強した中で初めて知ったんですけど、Int型の中にも複数の型があるみたいです。。。例えば、32ビットプラットフォームの上では32ビット、64ビットのプラットフォーム上では64ビットになるそうです。

また、明示的に指定も可能でInt16とすると16ビットのInt型を使用できます。

それぞれの型の最大値と最小値は、スタティックプロパティmin、maxからアクセス可能です。
( ※スタティックプロパティは型に紐づいたプロパティであり、型名.スタティックプロパティ名という書式でアクセス可能です。 )

例 )

let c = Int16.min
print(c)
let d = Int16.max
print(d)

実行結果

-32768
32767

上記の例では、Int16型という固定ビット数の整数型を使用しています。他には、Int8型、Int32型、Int64型が用意されていて、それぞれ8ビット、32ビット、64ビットです。

浮動小数点型

浮動小数点とは、浮動小数点方式で小数を表す数値型です。
下記の例のようにビットを桁の並びを表す仮数部と小数点の位置を表す指数部の2つに分け、これらをかけて小数を表す方式です。

例 )
(基数が10の場合)
123.456 ・・・ 仮数部 : 123456, 指数部 : -3

Swiftの主な浮動小数点型にはFloatとDoubleの2種類があり、それぞれ32ビットと64ビットの固定のビット数を持ちます。浮動小数点型には最大値や最小値を表すスタティックプロパティは用意されていません。(Float型はおよそ10の38乗の正負の値真で表すことができ、Double型はおよそ10の308乗の正負まで表すことができます。)
浮動小数点型はビット数によって、表現できる値の範囲だけでなく、値の精度も異なる点に注意します。 Float型は最小で6桁の精度しか持ちませんが、Double型は最小でも15桁の精度を持ちます。

例)

let e: Double = 12345678.9 // 12345678.9
let f: Float = 12345678.9 // 1.234568e+07

浮動小数点型が持つスタティックプロパティについて

浮動小数点型はスタティックプロパティとして、無限大を表すinfinityとNaN(Not a Number、非数)を表すnanを持っています。 まずinfinityについてですが、浮動小数点型に対する演算結果が無限大となった場合、その値はinfinityとなります。 このとき、値が無限大かどうかを表すisInfiniteプロパティはtrueを返します。

例)

let g: Double = 1.0 / 0.0
print(g.isInfinite)

let h: Double = Double.infinity
print(h.isInfinite)

実行結果

true
true

次にnanについてですが、まず非数であるNaNは演算として不正な値が渡されてしまい演算できなかったことを表します。 そして浮動小数点に対して不正な演算を行った場合、値はnanとなります。 このとき値がNaNかどうかを表すisNaNプロパティはtrueを返します。

例)

let i: Double = 0.0 / 0.0
print(i.isNaN)

let j: Double = Double.nan
print(j.isNaN)

実行結果

true
true

数値型同士の相互変換

まず大前提としてSwiftでは、整数型同士や浮動小数点同士であっても型が異なれば代入はできません。

例 )

let k: Int = 123
let l: Int64 = k // エラー

let m: Float = 1.0
let n: Double = m // エラー

数値型には、他の数値型の値から自分の型の値を生成するイニシャライザが用意されていて、これらを使用することで数値型同士の変換を行えます。

例 )

let o: Int64 = Int64(k)
let p: Double = Double(m)

生成したい型よりも精度の高い型から初期化すると、生成した方の精度に合わせて端数処理が行われます。

let q: Float = 1.99
let r: Int = Int(q) // 1

let s: Double = 12345678.9
let t: Float = Float(s) // 1.234568e+07

数値型の操作

基本的な操作は演算子を通じて行い、より高度な操作は数学関数を通じて行います。

比較

比較演算は、数値同士の大小関係を導く演算です。

123 == 456 // 左辺と右辺が一致する 左の場合だとfalse
123 != 456 // 左辺と右辺が一致しない 左の場合だとtrue
123 > 456 // 左辺が右辺より大きい 左の場合だとfalse
123 >= 456 // 左辺が右辺以上 左の場合だとfalse
123 < 456 // 左辺が右辺より小さい 左の場合だとtrue
123 <= 456 // 左辺が右辺以下 左の場合だとtrue

上記の例から分かるように、両辺の型は一致させる必要があり、型が一致しない場合はエラーになります。異なる型同士を比較するには、下記の例のように明示的な型変換を行い型を一致させる必要があります。

例 )

let u: Float = 123
let v: Double = 123
u == v // エラー
u == Float(v) // true

算術

算術演算子には、他のプログラム言語と同じように、四則演算と剰余演算子の5つがあります。

1) 加算

1 + 1 // 2

2) 減算

2 - 1 // 1

3) 乗算

2 * 3 // 6

4) 除算

4 / 2 // 2

5) 剰余

5 % 2 // 1

両辺の型が一致する場合のみ利用でき、一致しない場合はエラーとなります。(比較演算子と同様)

複合代入演算子

算術演算子と代入演算子 = を組み合わせた複合代入演算子という中値演算子を使用することも可能です。下記の例を見れば分かる通り、複合代入演算子を利用すると、変数に対する演算の結果を同じ変数に代入する処理を簡単に書けますね!

1) 加算

var w = 1
w += 3  // 4

2) 減算

var x = 5
x -= 3 // 2

3) 乗算

var y = 3
y *= 4  // 12

4) 除算

var z = 4
z /= 2 // 2

終わりに

今回、Swift 基本の型 第2回として数値型についてまとめました。型変換の部分でエラーを出すことはしょっちゅうだと思うので、気をつけてプログラムの作成をしたいですね!
また、今回、スタティックプロパティへのアクセスについてもまとめたので、合わせて押さえておきましょう!