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じゃないものの使い分けをしっかりやっていきましょう。
次は「配列」についてご紹介します。
この記事が気に入ったらサポートをしてみませんか?