Swiftの基本的な型(Types)

基本的な型

ここではSwiftにおける基本的な型(type)について説明していきます。型とは「値の種類」のことです。プログラミングでは様々なデータを取り扱いますが、整数や文字列など種類によって操作は違う場合がありますよね。つまり、すごくざっくり言うと、型は同じ種類のデータを取り扱う手助けをしてくれる便利なものです。

下のテーブルは、ここで紹介するSwiftの基本的な型の一覧です。

Swiftでの型 リテラル 簡単な説明 英語表記(型は省略)
Int -1,2015 符号付き整数型 integer
UInt 7,1000 符号なし整数型 unsigned integer
Double -1.5,3.14 64-bit浮動小数点型 64-bit floating point
Float -4.2,2.718 32-bit浮動小数点型 32-bit floating point
Bool true,false 論理型 boolean
String "hello!" 文字列型 string

他にもオプショナル型コレクション型などありますが、それらに関しては別のページで紹介します。

以下、上のテーブルにまとめたそれぞれの型と、型安全と型推論について簡単に紹介します。

整数型(Int)

整数型Intは小数点のつかない数です。

let one = 1
let twentyFifteen = 2015

ここでは宣言と初期化を同時に行い、整数リテラルによる型推論によって上記の定数は整数型になります。型推論に関しては後述します。

整数型は符号付きIntと符号なしUIntがあります。

ただし、Swiftの公式マニュアルによると、符号なし整数型UIntは、それが本当に必要な場合のみ使用するよう推奨されています。したがって、普通に整数型を使う場合は、符号付き整数型であるIntを使用した方が良いです。

“NOTE
Use UInt only when you specifically need an unsigned integer type with the same size as the platform’s native word size. If this is not the case, Int is preferred, even when the values to be stored are known to be non-negative. 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.”

抜粋:「The Swift Programming Language」、”The Basics – UInt”より

また、Swiftは8, 16, 32, 64-bitの整数を型として用意しています。例えば、16-bitならUInt16。ただし、これはInt(UInt)を型として使っている限り、基本的には意識しなくても良いようです。

浮動小数点型(Double, Float)

浮動小数点型は小数点以下を含むような数です。

let pi = 3.14
let oneHalf = 0.5

Swiftでは64-bit浮動小数点型Doubleと32-bit浮動小数点型Floatが用意されています。公式マニュアルでは、DoubleFloatのどちらでも構わない場合はDoubleを推奨しています。

また、Swiftの型推論では、浮動小数点型としてDoubleをデフォルトに選ぶようです。明示的に書くと、例えば

let pi: Double = 3.14

と同値です。

論理型(Bool)

論理型Boolとして取り得るのは2つの定数値のみで、truefalseです。

let chikaraIsPower = true
let catIsDog = false

論理型の値は特に条件分岐(if文など)の際に役立ちます。型安全で少し述べますが、Swiftでは非常に厳密に型を取り扱いますので、例えば整数型から論理型への暗黙の型変換は行われません。したがって、公式マニュアルにあるような以下のソースコードはコンパイルエラーになります。

// この構文だとコンパイルが通らない(整数型->論理型の暗黙の型変換をしない)
let i = 1 // 整数型
if i {
}
//コンパイルエラー
//error: type 'Int' does not conform to protocol 'BooleanType'

条件分岐のページで詳しく説明しますが、if文の条件は「論理型」でなければいけませんので、上記のように「整数型」ではエラーになります。

文字列型(String)

文字列型 Stringは、文字型であるCharacterの集合体です。

let say = "hello !"
var empty = ""

上記の例のように、Stringはダブルクォート"で囲む文字列リテラル(string literals)を値とします。また、2つ目の例のように文字列のない初期化""も可能です。

Stringでは+演算子(演算子に関しては「基本的な演算子」を参照下さい)を使って、文字列をつなげることも可能です。

let firstString = "hello "
let secondString = "world!"
firstString + secondString
// "hello world!" と表示

Swiftの型安全(type safety)と型推論(type inference)

型安全(type safety)とは、コンパイル時に型のミスマッチを事前に(エラーとして)防いでくれる便利な機能です。また、型推論(type inference)とは、明示的な型宣言をしなくても、型を適切に推測する機能です。

型安全(type safety)

Swiftでは変数や定数の型に関しては非常に厳密に取り扱われています。C言語などに比べると、型変換の自由度が減って少し不自由に感じるかもしれません。しかし、型の取り扱いを厳密に定義しておくことで、エラーをコンパイル時に検出することが容易になります

実際に試してみると分かりますが、例えばIntDoubleの演算はできません。

// IntとDoubleの演算
let someInt = 2
let someDouble = 1.5
let result = someInt + someDouble
// コンパイルエラー:error: binary operator '+' cannot be applied to operands of type 'Int' and 'Double'
私の個人的な経験ですが、プログラムが動かなくて困る場合、ほとんどは実行時エラー(runtime error)です。実行時エラーを可能なかぎり回避するには、コンパイル時にどれだけエラーを検出するかが鍵になります。そういう意味では、(私個人的には)このような厳密な仕様はうれしいです。

型推論(type inference)

型推論は定数と変数のページでもすでに使っていましたが、例えば以下のコードはコンパイルエラーになります。

var thisIsString = "this is string"
thisIsString = 1
// コンパイルエラー。Stringに整数1を代入しようとしています。

ここではthisIsString変数が"this is string"という文字列で初期化されています。今、型は明示的に指定されていませんが、Swiftのコンパイラは「文字列で初期化されているので、thisIsStringString型だな」と予測して型を決めます。これが型推論です。

まとめ

  • 型は明示的に宣言しなくてもいい(型推論)
  • 整数型Intは小数点以下のない数字。例)1, 2015
  • 浮動小数点型Doubleは小数点のある数字。例)3.14, 0.5
  • 論理型Booltruefalseのみ
  • 文字列型Stringはダブルクォートで囲む。例)"hello world!"
  • Swiftの型安全は厳密に適用される。例)IntDoubleの演算はコンパイルエラー