2015年9月1日火曜日

【Xcode / Swift入門】オプショナル型について

本稿では、Swiftのoptional type / optional value(オプショナル型)について、説明します。

オプショナル型について

オプショナル型とは、変数に何も値が入っていない状態(空の状態)と値が入っている状態(通常の状態)の両方を持つことができる変数もしくは定数のことを言います。つまり、空の値が入るかもしれない変数を使用する際に定義します。また、Swiftでは、変数に何も値が入っていない空の状態のことを"nil"と表現します(他のプログラミング言語の"null"と同義です)。

宣言方法は、変数を宣言時に、型の後ろに"?"をつけます。

var 変数名: 型?

では、Playgroundを起動し、下記のコードを記述してみます。
    
//Optional型にnilを代入
var optionalString: String? = "hello"
optionalString = nil
println(optionalString)

//通常の変数にnillを代入
var nomalString: String = "hello"
nomalString = nil
println(nomalString)

すると、Optional型の変数にnilを代入した場合は正常に動作しているのに対し、通常の(Optional型ではない)変数にnilを代入するとエラーを出力することがわかると思います。





このように、nilの値の許容を変数の定義時に行うことによって、nil起因によるアプリの不具合(バグ)を事前に対処することができます。また、アプリ開発者が忘れがちなnil対処をエラーレベルで(ビルド時に)チェックすることができます。

unwrap(アンラップ)について

次に、Optional型とセットで覚えておく必要があるアンラップについて説明します。
Swiftでは、通常の変数と、空の値が入るかもしれないOptional型の変数を明示的に区別しています。そのため、Optional型で定義した値を、関数の引数に代入する際、「"nill"ではありません」と明示的に定義する必要があります(指定しない場合、エラーが出力されます)。

例えば、下記のようにコードを記述してみます。
※文字列(" "で囲めば文字列と認識します。)の中に変数の値を代入したい場合は、\( )を使用します。「\」はoption + ¥です。
    
var optionalString: String?
var nomalString: String
optionalString = "hello"
nomalString = "world"
println("世界一有名なプログラムは\(optionalString + nomalString)である。")

すると、”Stringはオプショナル型の値だけど、unwrap(アンラップ)されていません”とエラーが出力されます。



この「"nill"ではありません」と明示的に定義する方法のことをunwrap(アンラップ)と呼び、変数の後ろに”!”をつけること宣言可能です。つまり、上記の例で言うと、”\(optionalString + nomalString)”のoptionalStringの後ろに"!"を付与することにより、エラーを回避し、正常に動作します。




暗黙的なアンラップについて

オプショナル型の宣言方法は上記(型の後ろに"?"をつける)以外にもう一つあります。それは、暗黙的なアンラップという方法です。これは、変数定義時に、"?"ではなく"!"をつけることにより、常にアンラップ状態となり、引数に渡す際の"!"が不要になります。



初期値には、nilが入るかもしれないが、それ以降は必ず値が入る(nilではない)場合に利用するものになります。

オプショナルバインディングについて

オプショナル型の変数をif文などの条件文にて使用する場合、 値が入っていれば"true"、nilの場合は"false"として扱うことが可能になります。例えば、下記のようなコードを記述し、optionalString = "hello"を削除してみてください(つまり、optionalString = nil)。
    
var optionalString: String!
var nomalString: String
optionalString = "hello"
nomalString = "world"

if let isString = optionalString {
    
    println("世界一有名なプログラムは\(optionalString + nomalString)である。")
    
}else{
    
    println("文字列なし")
    
}

optionalString = "hello"の場合とnilの場合で、条件が分岐していることが確認できます。



この手法は、"nil"の場合の処理を意識しなくとも記述することになりますので、とても便利な機能です。

オプショナル型の説明は以上になります。
次回は、for文 / While文などの制御構造について説明したいと思います。




0 件のコメント:

コメントを投稿