Swift 文法その1 - 変数とデータ型 -

よく使うデータ型

String: 文字列
Int: 整数
Float: 小数(32ビット)
Double: 小数(64ビット)
Bool: 真偽値
Any: 不特定の型

Swiftはデータ型に厳しい言語で、たとえば計算処理をする時に、Int と Double のような異なる型同士での計算はエラーになり、どちらかの型を変換して同じ型同士にする必要があります。

データ型の変換例

let a: Int = 1
Double(a) // 1

let b: Int = 1
String(b) // "1"

let c: Double = 1.5
Int(c) // 1

let d: Double = 1.5
String(d)

let e: String = "1"
Int(e) // 1

let f: String = "1.5"
Double(f) // 1.5

変数の宣言

再代入を許可する場合は var、許可しない場合(=定数など)は let を使用します。

var a = 1
a = 2

let a = 1
a = 2 // 再代入不可

Swiftには型推論の機能があるので、上記のように宣言と同時に値を代入するときは、データ型をつけなくても代入する値が文字列の場合は String、整数の場合は Int、小数の場合は Double と判断されます。

また、let で型付きで値を代入せず宣言した場合は、あとから1度だけ代入できます。

let a: String

if [1, 2].randomElement() == 1 {
   a = "1"
} else {
   a = "2"
}

Optional(オプショナル)型

Swift では変数が nil(値がない状態)になるかどうかを宣言の時に指定できます。nil が入る場合はデータ型の後に ? を付けます。

var a: String?

データ型に? がついた変数を Optional な変数といいます。たとえば String? のOptionalな変数をそのまま出力してみると、

var a: String? = "Hello"
print(a) //  // Optional("Hello")

となり、Optional つきで出力されていて、純粋な String にはなっていません。これを純粋な String に戻してみましょう。

unwrap(アンラップ)
Optionalな値を、元の型の値に直すことをいいます。変数の後ろに「!」をつけるだけです。

var a: String? = "Hello"
print(a!) // "Hello"

ただし、!をつけた時にまだ値が入っていなかった場合(nilの場合)はエラーになってしまいます。!で参照する前に nil かどうかを確かめたい場合は、「Optional Binding」という方法を使います。

Optional Binding(オプショナルバインディング)
if文を使ってアンラップすることを言います。条件式の部分で値を代入してみて、値が入っている場合は条件式がtrueになります。if文の中ではアンラップされた値を参照できます。

var a: String? = "Hello"
if let a = a {
    print(a) // "Hello"
}​

Optional Chaining(オプショナルチェーン)
Optionalな型のメソッドを呼び出すことを言います。たとえば String には「count」という文字数を返すメソッドがありますが、OptionalなStringでもこのメソッドを呼び出すことができます。変数の後ろに「?」をつけるだけです。

var a: String? = "Hello"
print(a?.count) // "Optional(5)"

?をつけた場合はメソッドの返り値もOptionalになるので、Optionalじゃない結果が欲しい場合は?ではなく!で呼び出すか、返り値をアンラップしてあげましょう。

型のキャスト

Any型で宣言された変数にはどんな型の値も入れることができますが、実際にその変数を使って何らかの処理を行う場合は、変数に入っている値がどんな型なのかを判定する必要があります。変数を特定のデータ型に変換することを「キャストする」と言います。

特定の optional 型に変換する場合は as?、 optional でない型に変換する場合は as! を使用します。

var a: Any? = "Hello"

var b = a as? String // "Optional("Hello")
var c = a as? Int // nil

var d = a as! String // "Hello"
var e = a as! Int // エラー

おさらい

変数やデータ型については他のプログラミング言語でもだいたい同じですね。
ちょっと迷うのは Optional の扱い方でしょうか。Optional は便利なのですが、多用するのはおすすめできません。呼び出す時に?をつける手間があるのと、メソッドの返り値も Optional になってしまうのでアンラップがめんどうだったりします。

また、よくあるミスとして、文字列の中で変数の値を展開(また後日説明します)する時に、アンラップせずに Optional の状態で展開してしまい、それをそのまま画面上に表示してしまったりすると、本文で書いた通りOptional("...") と表示されてしまうので要注意です。

プログラミング設計をする上で、var や let、Optional、Optionalじゃないものの使い分けをしっかりやっていきましょう。

次は「配列」についてご紹介します。

この記事が気に入ったらサポートをしてみませんか?