・Swiftに関する他の記事はこちら
Swift入門 勉強記録 その1 Swiftとは、Playground起動
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)
エラーである。。。
変数addressを初期化する前に利用しようとしている、とエラーになった。
Objective-Cをやっていた自分といては、えっ、となる。
Objective-Cではエラーにならないのだ。
こんな感じだ。
NSString *address;
NSLog(@"%@", address);
では、nilをいれてあげよう。
```
import UIKit
var address:String = nil
println(address)
```
また、エラーとなった。
String型の変数addressにはString型を入れなければならない。
nilはString型ではないのだ。
Swiftではバグを埋め込まないよう安全性を追求しているのだろう。
しかし、変数にはnilを入れられないのか?
APIにリクエストして、返り値がないこともあるだろう。
他にも、返り値がない場合があるだろう。
どうするか?
ここで登場するのがOptional型という型だった。
Optional型
どのように使うのか?
型を指定した最後に?をつけるだけだ。
var address:String?
これで変数addressにはnilまたはString型を入れることができる。
import UIKit
var address:String?
println(address)
明確にnilを入れてもエラーにはならない。
import UIKit
var address:String? = nil
println(address)
エラーにならないでしょ。
文字列を入れられるかも確認しよう。
import UIKit
var address:String? = "Tokyo Adachi"
println(address)
入力した文字列は表示されているが、
Optional()というおまけが付いている。
?をつけてOptional型にしても、
String型と同じようには使えないようだ。
試してみよう。
import UIKit
var address:String? = "Tokyo Adachi"
address = address.uppercaseString
println(address)
Optional型のunwrapping(解凍と訳す?)
String?はuppercaseStringを使えないということらしい。
Optional型はnilが入っている可能性があるので、
SwiftではOptional型をそのまま使うことを制限することで、
安全性を高めようとしているようだ。
一度他の変数に入れるとString型と同じように使える。
unwrapと呼ばれる。
import UIKit
var address:String? = "Tokyo Adachi"
if let unwrappedAddress = address{
println(unwrappedAddress)
}
String型として使えるね。
また、
import UIKit
var address:String?
if let unwrappedAddress = address{
println(unwrappedAddress)
}else{
println("nilだった")
}
忘れないようにもう一度書く。
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だった")
}
やはりエラーになるが、コンソールに表示されているエラーメッセージを読み理由を推測すると。。。
if文の条件がunwrappingの場合、
unwrapできた → true
unwrapできない、つまりnil → false
のようだ。
強制unwrapping
Optional型の変数を他の変数に入れなくても、unwrappingできる。
これを強制unwrappingと呼ぶ。
使い方は変数名の最後に!をつけるのだ。
試す。
import UIKit
var address:String? = "Tokyo Adachi"
println(address!.uppercaseString)
エラーにならなかったよ。
強制unwrappingするが、変数がnilだった場合、エラーになるよ。
import UIKit
var address:String?
println(address!.uppercaseString)
確実にnilでないとわかっているときにしか使ってはならない。
unwrappingのために、別の変数を用意しなくていいのは便利だが、
Swiftが追求しているだろう安全性を損なってしまうね。
暗黙的unwrapping
変数の型を指定するときに型の最後に!をつけるのだ。
import UIKit
var address:String! = "Tokyo Adachi"
println(address!.uppercaseString)
しかし、この暗黙的unwrappingは何のために使うか不明だ。
今回はここまで。
・Swiftに関する他の記事はこちら
Swift入門 勉強記録 その1 Swiftとは、Playground起動