LoginSignup
10
13

More than 5 years have passed since last update.

Swift入門 勉強記録 その9 Optional型

Last updated at Posted at 2014-09-23

 
・Swiftに関する他の記事はこちら
Swift入門 勉強記録 その1 Swiftとは、Playground起動

Swift入門 勉強記録 その2 変数、定数、文字列

Swift入門 勉強記録 その3 セミコロン

Swift入門 勉強記録 その4 数値、真偽値

Swift入門 勉強記録 その5 Tuple(組)とは

Swift入門 勉強記録 その6 数値を文字列とするには

Swift入門 勉強記録 その7 繰り返し

Swift入門 勉強記録 その8 条件分岐

Swift入門 勉強記録 その9 Optional型

Swift入門 勉強記録 その10 Collection
 

Optional型について学ぶ前に、
Objective-Cとはnilの扱いが変わったようなので、
そこを学ばなければいけないようだ。

nilのチェック

Objective-Cでの開発中、nilになるはずがない変数のチェックをするとき、
NSAssertを使い、チェックしていた。
NSAssertを使えば、nilとなっていたら、アプリが終了してくれた。

Swiftではnilの扱いが変わったので、
NSAssertを使ったチェックに変わる方法があるのかもしれない。

nilの扱いについて、少しづつ見ていく。

Swiftでのnilの扱い

まずはnilと関係ない状態のソースを書いておく。

import UIKit

var address = "Tokyo Adachi"
println(address)

コンソールにTokyo Adachiと表示される。
何も新しいことはない。

変数への値の入力部分を削除し、変数addressをnilにしよう。
なお、入力がなくなると型推測ができなくなるので、
型の指定を追加している。

import UIKit

var address:String
println(address)

スクリーンショット 2014-09-23 02.23.06.png

エラーである。。。
変数addressを初期化する前に利用しようとしている、とエラーになった。
Objective-Cをやっていた自分といては、えっ、となる。

Objective-Cではエラーにならないのだ。
こんな感じだ。

NSString *address;
NSLog(@"%@", address);

スクリーンショット 2014-09-23 02.26.39.png

では、nilをいれてあげよう。
```
import UIKit

var address:String = nil
println(address)
```

スクリーンショット 2014-09-23 02.35.13.png

また、エラーとなった。
String型の変数addressにはString型を入れなければならない。
nilはString型ではないのだ。

Swiftではバグを埋め込まないよう安全性を追求しているのだろう。

しかし、変数にはnilを入れられないのか?
APIにリクエストして、返り値がないこともあるだろう。
他にも、返り値がない場合があるだろう。

どうするか?
ここで登場するのがOptional型という型だった。

Optional型

どのように使うのか?

型を指定した最後に?をつけるだけだ。
var address:String?

これで変数addressにはnilまたはString型を入れることができる。

import UIKit

var address:String?
println(address)

スクリーンショット 2014-09-23 13.42.44.png

明確にnilを入れてもエラーにはならない。

import UIKit

var address:String? = nil
println(address)

スクリーンショット 2014-09-23 13.44.21.png

エラーにならないでしょ。

文字列を入れられるかも確認しよう。

import UIKit

var address:String? = "Tokyo Adachi"
println(address)

スクリーンショット 2014-09-23 13.48.20.png

入力した文字列は表示されているが、
Optional()というおまけが付いている。

?をつけてOptional型にしても、
String型と同じようには使えないようだ。

試してみよう。

import UIKit

var address:String? = "Tokyo Adachi"
address = address.uppercaseString
println(address)

スクリーンショット 2014-09-23 13.53.46.png

Optional型のunwrapping(解凍と訳す?)

String?はuppercaseStringを使えないということらしい。
Optional型はnilが入っている可能性があるので、
SwiftではOptional型をそのまま使うことを制限することで、
安全性を高めようとしているようだ。

一度他の変数に入れるとString型と同じように使える。
unwrapと呼ばれる。

import UIKit

var address:String? = "Tokyo Adachi"

if let unwrappedAddress = address{
    println(unwrappedAddress)
}

スクリーンショット 2014-09-23 14.09.08.png

String型として使えるね。

また、

import UIKit

var address:String?

if let unwrappedAddress = address{
    println(unwrappedAddress)
}else{
    println("nilだった")
}

スクリーンショット 2014-09-23 14.12.54.png

忘れないようにもう一度書く。
Swiftではnilが入っている可能性があるOptional型を使うには一度チェックをすることで安全性を高めている。

※if文の条件はtrue/falseでなければいけないと学んだ。true/falseではないと思うが、これはありなのか???

変数addressをString型で定義して、試す。

import UIKit

var address:String = "Tokyo Adachi"

if let unwrappedAddress = address{
    println(unwrappedAddress)
}else{
    println("nilだった")
}

スクリーンショット 2014-09-23 14.27.20.png

やはりエラーになるが、コンソールに表示されているエラーメッセージを読み理由を推測すると。。。

if文の条件がunwrappingの場合、
 unwrapできた → true
 unwrapできない、つまりnil → false
のようだ。

強制unwrapping

Optional型の変数を他の変数に入れなくても、unwrappingできる。
これを強制unwrappingと呼ぶ。
使い方は変数名の最後に!をつけるのだ。

試す。

import UIKit

var address:String? = "Tokyo Adachi"
println(address!.uppercaseString)

スクリーンショット 2014-09-23 14.40.03.png

エラーにならなかったよ。

強制unwrappingするが、変数がnilだった場合、エラーになるよ。

import UIKit

var address:String?
println(address!.uppercaseString)

スクリーンショット 2014-09-23 14.42.49.png

確実にnilでないとわかっているときにしか使ってはならない。
unwrappingのために、別の変数を用意しなくていいのは便利だが、
Swiftが追求しているだろう安全性を損なってしまうね。

暗黙的unwrapping

変数の型を指定するときに型の最後に!をつけるのだ。

import UIKit

var address:String! = "Tokyo Adachi"
println(address!.uppercaseString)

スクリーンショット 2014-09-23 14.53.36.png

しかし、この暗黙的unwrappingは何のために使うか不明だ。

今回はここまで。
 
 
・Swiftに関する他の記事はこちら
Swift入門 勉強記録 その1 Swiftとは、Playground起動

Swift入門 勉強記録 その2 変数、定数、文字列

Swift入門 勉強記録 その3 セミコロン

Swift入門 勉強記録 その4 数値、真偽値

Swift入門 勉強記録 その5 Tuple(組)とは

Swift入門 勉強記録 その6 数値を文字列とするには

Swift入門 勉強記録 その7 繰り返し

Swift入門 勉強記録 その8 条件分岐

Swift入門 勉強記録 その9 Optional型

Swift入門 勉強記録 その10 Collection
 

10
13
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
10
13