スイフトベースのオプション

オプションを使用して、値が欠落している可能性がある状況を処理します。オプションの意味:(値あり)xに等しいまたは(値なし)。
:CおよびObjective-Cにはオプションの概念はありません。最も近いのはObjective-Cの機能で、メソッドはオブジェクトまたはnilを返します。nilは「有効なオブジェクトの欠如」を意味します。ただし、これはオブジェクトに対してのみ機能します。構造体、基本的なC型、または列挙型の場合は機能しません。これらのタイプの場合、Objective-Cメソッドは通常、値が欠落していることを示す特別な値(NSNotFoundなど)を返します。このメソッドは、メソッドの呼び出し元が特別な値を認識し、判断することを覚えていることを前提としています。ただし、Swiftのオプションにより、任意のタイプの値が欠落しており、特別な値を必要としないことを暗示することができます。

例を見てみましょう。SwiftのString型には、String値をInt値に変換するために使用されるtoIntというメソッドがあります。ただし、すべての文字列を整数に変換できるわけではありません。文字列「123」は数値123に変換できますが、文字列「hello、world」は変換できません。

次の例では、toIntメソッドを使用して、文字列をIntに変換しようとします。

let possibleNumber = "123"
var convertedNumber = Int(possibleNumber)
// convertedNumber 被推测为类型 "Int?", 或者类型 "optional Int"

toIntメソッドは失敗する可能性があるため、Intではなくオプションの(オプションの)Intを返します。オプションのIntは、IntではなくInt?として記述されます。疑問符は、含まれる値がオプションであることを意味します。つまり、Int値が含まれる場合と含まれない場合があります。(ブール値や文字列値などの他の値を含めることはできません。Intまたは何も含めることはできません。)

1つ:ifステートメントと強制解析

ifステートメントを使用して、オプションに値が含まれているかどうかを判別できます。オプションに値がある場合、結果はtrueです。値がない場合、結果はfalseです。

オプションのパッケージに値が含まれていることが確実な場合は、オプションの名前の後に感嘆符(!)を追加して値を取得できます。この感嘆符は、「このオプションには値があることを知っています。使用してください」という意味です。これは、オプション値の強制アンラップと呼ばれます。

if (convertedNumber != nil) {
    print("\(possibleNumber) has an integer value of \(convertedNumber!)")
}else {
    print("\(possibleNumber) could not be converted to an integer")
}
// 输出 "123 has an integer value of 123"

:!を使用すると、存在しないオプションの値を取得すると、ランタイムエラーが発生します。使用する前に!値を強制的に解析するには、オプションにnil以外の値が含まれていることを確認してください。

2:オプションのバインディング

オプションのバインディングを使用して、オプションに値が含まれているかどうかを判別し、含まれている場合は、値を一時定数または変数に割り当てます。オプションのバインディングをifおよびwhileステートメントで使用して、オプションの値を判断し、その値を定数または変数に割り当てることができます。ifおよびwhileステートメントについては、制御フローを参照してください。

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

if let constantName = someOptional {
    statements
}

上記のように、オプションのバインディングを使用して、possibleNumberの例を書き直すことができます。

if let actualNumber = Int(possibleNumber) {
    print("\(possibleNumber) has an integer value of \(actualNumber)")
} else {
    print("\(possibleNumber) could not be converted to an integer")
}
// 输出 "123 has an integer value of 123"

このコードは次のように理解できます。
「possibleNumber.toIntによって返されるオプションのIntに値が含まれている場合は、actualNumberという新しい定数を作成し、それに含まれるオプションの値を割り当てます。」

変換が成功した場合、actualNumber定数をifステートメントの最初のブランチで使用できます。オプションのインクルード値によって初期化されているため、値を取得するために!サフィックスを使用する必要はありません。この例では、actualNumberは変換結果を出力するためにのみ使用されます。

オプションのバインディングで定数と変数を使用できます。ifステートメントの最初のブランチでactualNumber値を操作する場合は、if var actualNumberに変更して、オプションで含まれる値が定数ではなく変数に割り当てられるようにすることができます。

3:なし

オプションの変数にnilの値を割り当てて、値がないことを示すことができます。

var serverResponseCode: Int? = 404
// serverResponseCode 包含一个可选的 Int 值 404
serverResponseCode = nil
// serverResponseCode 现在不包含值

:nilは、オプション以外の定数および変数には使用できません。欠落している値を処理する必要のある定数または変数がコードにある場合は、それらを対応するオプションの型として宣言してください。

値を割り当てずにオプションの定数または変数を宣言すると、それらは自動的にnilに設定されます。

var surveyAnswer: String?
// surveyAnswer 被自动设置为 nil

:SwiftのnilはObjective-Cのnilと同じではありません。Objective-Cでは、nilは存在しないオブジェクトへのポインタです。Swiftでは、nilはポインターではなく、欠落している値を示すために使用される明確な値です。オブジェクトタイプだけでなく、任意のタイプのオプションをnilに設定できます。

4:オプションの暗黙的な解決

上記のように、オプションは、定数または変数が「値なし」を持つことができることを意味します。オプションでは、ifステートメントを使用して値があるかどうかを判別できます。値がある場合は、オプションのバインディングを使用して値を解析できます。

プログラムアーキテクチャでは、最初の割り当ての後、オプションが常に値を持っていると判断できる場合があります。この場合、オプションの値は常に値を持つと判断できるため、毎回オプションの値を判断して解析することは非常に非効率的です。このタイプのオプションは、暗黙的にアンラップされたオプションとして定義されます。オプションタイプとして使用するタイプの後の疑問符(String?)を感嘆符(String!)に変更して、暗黙的に解決されたオプションを宣言します。

オプションに初めて値が割り当てられたとき、それ以降は常に値があると判断できます。オプションの暗黙的な解決は非常に便利です。オプションの暗黙的解決は、主にSwiftでのクラスの構築に使用されます。クラス・インスタンス間の強力な循環参照を参照してください。

暗黙的に解決されたオプションは、実際には通常のオプションですが、非オプションとして使用でき、オプションの値を取得するために毎回解決する必要はありません。次の例は、オプションの文字列と暗黙的に解決されたオプションの文字列の違いを示しています。

let possibleString: String? = "An optional string."
print(possibleString!) // 需要感叹号来获取值
// 输出 "An optional string."

let assumedString: String! = "An implicitly unwrapped optional string."
print(assumedString as Any) // 不需要感叹号
// 输出 "An implicitly unwrapped optional string."

暗黙的に解決されたオプションは、自動的に解決できるオプションと考えることができます。宣言するときは、各値のオプションの名前の最後ではなく、タイプの最後に感嘆符を付けるだけです。

:暗黙的に解析されたオプションに値がないときに値を取得しようとすると、ランタイムエラーがトリガーされます。これは、値のない通常のオプションの後に感嘆符を追加するのと同じです。

暗黙的に解決されたオプションを通常のオプションとして扱い、値が含まれているかどうかを判断することもできます。

if (assumedString != nil) {
    print(assumedString as Any)
}
// 输出 "An implicitly unwrapped optional string."

オプションのバインディングでオプションの暗黙的な解決を使用して、その値をチェックおよび解析することもできます。

if let definiteString = assumedString {
    print(definiteString)
}
// 输出 "An implicitly unwrapped optional string."

:変数が後でnilになる可能性がある場合は、オプションの暗黙的な解決を使用しないでください。変数のライフサイクル中にゼロかどうかを判断する必要がある場合は、一般的なオプションの型を使用してください。

公式アカウント[SwiftCommunity]をフォローすることを歓迎します

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_36478920/article/details/103667459