English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift オプション型(Optional)

この記事では、オプションとその用例、Swiftでのオプションの処理について学びます。

前回の記事で、Swiftで利用できる異なるデータ型について学び、これらの型宣言の変数や定数にはデフォルト値があることに気づきました。

例:

let someValue = Int()
print(someValue)

このプログラムを実行すると、出力は以下の通りです:

0

しかし、Swiftにはオプションと呼ばれる別のデータ型があります。デフォルト値は空値(nil)です。変数や定数に値が含まれていない場合、オプションを使用できます。オプションの型は、値を含むか、値を持たない可能性があります(空値)。

技術的には、それはオプションの靴箱と考えられます。靴箱には靴が入っているかもしれませんが、入っていないかもしれません。したがって、靴を取るときは、事前に知っておく必要があります。

オプションを宣言する方法

データ型をオプションとして簡単に表現する方法は、データ型の後に!または?を追加することです。オプションの変数に値が含まれている場合、その値をOptional <Value>として返し、値が含まれていない場合、nilを返します。

例1:Swiftでオプションを宣言する方法

var someValue: Int?
var someAnotherValue:Int!
print(someValue)
print(someAnotherValue)

このプログラムを実行すると、出力は以下の通りです:

nil
nil

上記のプログラムでは、?と!を使用してオプションの型を初期化しています。どちらの方法もオプションを作成できますが、主な違いについて以下で説明します。

宣言されたオプションのIntは、整数値または値を持たない可能性があります。変数に値が割り当てられていないため、2つのprint文の結果としてnilがスクリーンに表示されます。

例2:オプションオブジェクトから値を割り当ててアクセス

let someValue: Int? = 5
print(someValue)
print(someValue!)

このプログラムを実行すると、出力は以下の通りです:

Optional(5)
5

上記のプログラムでは、オプションのInt型を宣言し、その中に値を割り当てています。5。

オプションをprint(someValue)で印刷すると、返されます。5ではなく、Optional(5)。それには、以下の形式があります:Optional <Value>。<Value>にアクセスするには、解包と呼ばれる方法が必要です。デコード)のメカニズムを使用して。

変数/定数の末尾に文字!を付けてオプションのコンテンツを展開します。以下のように print(someValue!)。print(someValue!) はオプションのコンテンツを解決し、スクリーンに表示します。 5。

ただし、アクセスするオプションが確実に値を持っている場合にのみ、このデコードメカニズムを使用してください。

例3:包装されていないオプションを明示的に宣言

デコードされたオプションのコンテンツを作成するには以下のようにできます:

let someValue:Int! = 5
print(someValue)

このプログラムを実行すると、出力は以下の通りです:

5

上記のプログラムでは、Int! は包装されていないオプションのコンテンツを作成し、それにアクセスすると自動的にデコードされるため、毎回!文字を使用する必要はありません。

これらのオプションを使用する際には、変数がアクセス時に常に値を持っていることを確認してください。そうしないと、致命的なエラーが発生する可能性があります。

例4:nullの未包装オプションオブジェクトへのアクセス時に致命的なエラーが発生します

var someValue: Int!
var unwrappedValue:Int = someValue //この行によりクラッシュします。

このプログラムを実行すると、致命的なエラーが発生し、クラッシュします:Optional値をアンラップする際に予期せぬnilが見つかりました、このコードunwrappedValue:Int = someValueは、Optional someValueの値を変数unwrappedValueに割り当てようとしました。

しかし、somevalueはnil値を含むオプション型です。nil値を変数unwrappedValue(これはオプションではありません)に割り当てようとすると、クラッシュします。

この状況を処理する異なる方法について説明します。

オプション処理

オプション値を使用するには、それをアンラップする必要があります。オプション値を使用するより良い方法は、!演算子を使用して強制的にアンラップするのではなく、条件アンラップを使用することです。

これは条件アンラップの質問です。この変数に値があるかどうかをチェックしますか?値を提供する場合、nilの処理を行います。

逆に、強制的なアンラップはその変数が実際に値を持っていることを意味します。したがって、nilの変数を強制的にアンラップするとき、プログラムはアンラップ中にオプション例外が発生し、予期せぬnilが見つかったときに例外をスローします。以下は、条件アンラップに使用されるいくつかの技術を説明しています:

1.if文

if文を使用して、オプション引数が値を含んでいるかどうかを調べることができます。if文では比較演算子「等しい」演算子(==)または「不等しい」演算子(!=)を使用できます。

例5:if else文のオプション処理

var someValue: Int?
var someAnotherValue: Int! = 0
        
if someValue != nil {
	print("値を含んでいます \(someValue!)")
}
	print("値を含まない")
}
        
if someAnotherValue != nil {
	print("値を含んでいます \(someAnotherValue!)")
}
	print("値を含まない")
}

このプログラムを実行すると、出力は以下の通りです:

値を含まない
値0を含む

上記のプログラムでは、オプション文が値を含んでいる場合、if文内のコードを実行し、それがなければelseブロック内の文を実行します。この方法でオプションを処理する主な欠点は、まだオプションから!演算子を使用して値をアンラップする必要があることです。

2.オプションバインディング(if let)

オプションバインディングを使うことで、オプション値が値を含んでいるかどうかを調べることができます。オプション値が値を含んでいる場合、その値は一時的な定数や変数として使用できます。したがって、オプションバインディングをif文と一緒に使用して、オプション内の値をチェックし、一つの操作でその値を定数や変数として抽出することができます。

例5:if let文を使用するオプショナル処理

var someValue: Int?
var someAnotherValue: Int! = 0
       
if let temp = someValue {
	print("値0を含む \(temp)") 
}
	print("値を含まない")
}
        
if let temp = someAnotherValue {
	print("値0を含む  \(temp)")
}
	print("値を含まない")      
}

このプログラムを実行すると、出力は以下の通りです:

値を含まない
値0を含む

上記のプログラムでは、オプショナル文が値を含んでいる場合にはif文内のコードを実行し、そうでない場合にはelseブロックを実行します。if-let文はまた自動的にその値をアンラップし、アンラップされた値をtemp変数に格納します。このメソッドの主な利点は、オプショナル内容が値を含んでいると確定できた場合でも、その値を強制的にアンラップする必要がないことです。

3.Guard文

Swiftでguard文を使用してオプショナル内容を処理することもできます。guardが何かを知らない場合は心配しないでください。今は、guardをifとして考えてください。-elseにifを阻止する条件はありません。条件が失敗すると、else文が実行されます。そうでない場合、次の文が実行されます。詳細については、参照してくださいSwift Guard

例6:Guardを使用するオプショナル処理

func testFunction() {
	let someValue: Int? = 5
	guard let temp = someValue else {
		return
	}
	print("It has some value \(temp)")
}
testFunction()

このプログラムを実行すると、出力は以下の通りです:

It has some value 5

上記のプログラムでは、guardに条件が含まれており、それはオプショナルのsomeValueが値を含んでいるかどうかです。someValueが値を含んでいる場合には、guard-let文は自動的にその値をアンラップし、アンラップされた値をtemp変数に格納します。そうでない場合、elseブロックが実行され、呼び出し関数に戻ります。オプショナルが値を含んでいるため、print関数が呼び出されます。詳細については、Swift guardを参照してください。

4.オプショナルアニマータ(??)

Swiftでは、オプショナルアニマータを使用してオプショナルが値を含んでいるかどうかを確認することもできます。それは(a??b)として定義されています。それはオプショナルのaを展開し、aが値を含んでいる場合にはそれを返し、aがnilの場合にはデフォルトの値bを返します。

例7:オプショナル処理のオプショナルアニマータを使用

var someValue: Int!
let defaultValue = 5
let unwrappedValue: Int = someValue ?? defaultValue
print(unwrappedValue)

このプログラムを実行すると、出力は以下の通りです:

5

上記のプログラムでは、変数someValueはオプションとして定義されており、nil値を含んでいます。空合演算子はオプション値を解包することができず、defaultValueを返します。したがって、文print(unwrappedValue)はコントロールタブでdefaultValueを出力5。

var someValue: Int? = 10
let defaultValue = 5
let unwrappedValue: Int = someValue ?? defaultValue
print(unwrappedValue)

このプログラムを実行すると、出力は以下の通りです:

10

したがって、空合演算子はsomeValueの値を成功して解包した。10。10、文print(unwrappedValue)を出力10。