LoginSignup
13
12

More than 5 years have passed since last update.

Swift オプショナル入門(備忘録的)

Last updated at Posted at 2015-09-02

Optional型とは:

 String型、Int型と同じデータの型
 nil(何もないこと)を許容する
 
宣言

 var num: Int?
 println(num) // => nil
 var str: String!
 println(str) // => nil

 両方ともにnilを返すので、宣言時にはnilが代入される。

var str: String? = "Hello World"
println(str)            // => Optional("Hello World")

非オプショナル宣言

var str: String
println(str)    // => Variable 'str' used before being initializedというエラーが発生

非オプショナル宣言、つまり普段の変数宣言では、何か値を入れないと、実行した時にエラーが発生

非OPtionalの値とOptionalの値を足し合わせる

var a: Int = 10
var b: Int? = 10
a + b   // => エラーが起きる

理由:10(Int型)と10(Optional型)同士は計算出来ない
計算を行いたい場合は、Optinal型の値を通常に値に変換するために「アンラップ」を行う。

アンラップとは

コードから見てみると

var a: Int = 10 //非オプショナル型
var b: Int! = 10    //暗黙的アンラップ型
a + b   // => 20

つまり、そのままでは使えないOptional型の値を、String型、Int型等として直接扱えるデータ型として変換する処理のこと。
ちなみに、変数宣言時に「!」をつけて変数を定義することを「暗黙的アンラップ型」という。

また、アンラップにはいくつかのパターンが存在する.....
1. 強制的アンラップ
2. オプショナル・バインディング
3. オプショナル・チェインニング

1. 強制的アンラップ

var optional: Int? = 10 //Optional型
println(optional)       // => Optional(10)

//強制的アンラップ(!をつけて)で出力
println(optional!)  // => 10

1つ注意点:

var num: Int?
num!    // => Optional型の変数numはnilなので、エラー発生

これは、強制的アンラップする対象のOptional型変数の中身がnilの場合、エラーが出るため、アプリが落ちてしまう!!
 そのため、中身がnilかどうか分からない場合は「オプショナル・チェインニング」か「オプショナル・バインディング」を使用
 

2. オプショナル・バインディング

var name: String?   //オプショナル型
var name: String? = "夏目漱石"

if let unwrappedName = name {
    // nameに値があれば、”夏目漱石”が代入される
    println(unwrappedName)  // => "夏目漱石" アンラップされて出力される
} else {
    // nameがnilであれば、ここの処理が実行される
    println("吾輩は猫である。名はまだないっ!!")  // => "吾輩は猫である。名はまだないっ!!"
}

if let構文(varでもいい)を使って、対象となる値がnilかどうかを判別して、アンラップできる。それによって、不意にアプリが落ちることを防ぐことができる。

3. オプショナル・チェインニング

オプショナル型の変数にプロパティを取得したり、メソッドを呼び出せる。

class Human() {
    let name: String = "イカ娘ちゃん"

    func hello() {
        println("侵略してやるでゲソ!!")
    }
}

var human: Human? = Human()

// nilでないため、プロパティが取得できる
human?.name // => Optional("イカ娘ちゃん")

// nilでないため、メソッドを呼び出せる
human?.hello()  // => Optional("侵略してやるでゲソ!!")

nil出ない場合、つまり、Humanクラスのプロパティ、メソッドに値や処理が書かれていない場合は、nilを返す

var human: Human?

// humanはnilなので、nilが返る
human?.name // => nil
human?.hello()  // => nil

コード主体で、細かい解説はできなかったですが、参考にしていただけると幸いでございます。

13
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12