Swiftのオプションタイプ


Swift の Optional 型。欠損値の処理に使用されます。 Optional は、「そこに値があり、それが x に等しい」または「そこに値が存在しない」ことを意味します。

Swfit 言語定義のサフィックス?名前付き型 Optional の短縮形として、つまり、次の 2 つの宣言は同等です:

var optionalInteger: Int?
var optionalInteger: Optional<Int>

どちらの場合も、変数OptionalInteger はオプションの整数型です。 type と ? の間にあることに注意してください。それらの間にはスペースはありません。

Optional は、None と Some(T) の 2 つのケースを含む列挙で、値があるかどうかを示すために使用されます。どの型もオプションの型として明示的に宣言 (または暗黙的に変換) できます。オプションの型を宣言するときは、必ず括弧を使用してください。オペレーターにとって適切なスコープ。たとえば、オプションの整数配列を宣言するには、(Int[])? として記述する必要があります。Int[]? として記述すると、エラーが報告されます。

初期値を指定せずにオプションの変数またはオプションのプロパティを宣言すると、その値はデフォルトで nil になります。

オプションのオプションは LogicValue プロトコルに従うため、ブール環境で表示できます。この場合、オプションの型 T? に型 T の値が含まれている場合 (つまり、その値が Optional.Some(T) である場合)、オプションの型は true に等しく、それ以外の場合は false になります。

オプションの型のインスタンスに値が含まれている場合は、後置演算子を使用できます。この値にアクセスするには、次のようにします:

optionalInteger = 42
optionalInteger! // 42

演算子を使用してください!値が nil のオプションの変数を取得すると、実行時エラーが発生します。

オプションのチェーンとオプションのバインディングを使用して、オプションの式に対する操作を選択的に実行できます。値が nil の場合、操作は実行されず、実行時エラーは報告されません。

Swift でのオプションの型の適用を理解するために、次の例を詳しく見てみましょう:

import Cocoa

var myString:String? = nil

if myString != nil {
    print(myString)
}else{
    print("字符串为 nil")
}

上記のプログラムの実行結果は次のとおりです:

字符串为 nil

オプションの型は、次のポインターの nil 値に似ています。 Objective-C ですが、nil はクラスにのみ適用されますが、オプションはすべての型で使用でき、より安全です。


強制解析

オプションの型に実際に値が含まれていることを確認したら、オプションの名前の後に感嘆符 (!) を追加して値を取得できます。この感嘆符は、「このオプションに値があることはわかっています。それを使用してください。」を意味します。これは、オプション値の強制アンラップと呼ばれます。

例は次のとおりです:

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if myString != nil {
   print(myString)
}else{
   print("myString 值为 nil")
}

上記のプログラムの実行結果は次のとおりです:

Optional("Hello, Swift!")

オプションの値を強制的に解析するには、感嘆符(!)を使用します:

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if myString != nil {
   // 强制解析
   print( myString! )
}else{
   print("myString 值为 nil")
}

上記のプログラムの実行結果は:

Hello, Swift!

注:
の値を使用します。 !来获取一个不存在的可选值会导致运行时错误。使用!来强制解析值之前,一定要确定可选包含一个非nil


自動解析

オプションの変数を宣言するときに、疑問符 (?) を感嘆符 (!) に置き換えることができます。このように、オプションの変数を使用するときに値を取得するために感嘆符 (!) を追加する必要はなく、自動的に解決されます。

例は次のとおりです:

import Cocoa

var myString:String!

myString = "Hello, Swift!"

if myString != nil {
   print(myString)
}else{
   print("myString 值为 nil")
}

上記のプログラムの実行結果は次のとおりです:

Hello, Swift!

オプション バインディング

オプション バインディングを使用して、オプションの型に値が含まれているかどうかを判断します。値が含まれている場合は、その値を一時的な定数または変数に割り当てます。オプションのバインディングを if ステートメントと while ステートメントで使用して、オプションの値を評価し、その値を定数または変数に割り当てることができます。

次のように if ステートメントにオプションのバインディングを記述します:

if let constantName = someOptional {
    statements
}

簡単なオプションのバインディングの例を見てみましょう:

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if let yourString = myString {
   print("你的字符串值为 - \(yourString)")
}else{
   print("你的字符串没有值")
}

上記のプログラムの実行結果は次のとおりです:

你的字符串值为 - Hello, Swift!