1. オプション型の概念
オプションのタイプは、「x に等しい値がある、または値がまったくない」ことを示すために使用されます。Optional 型に遭遇すると、ここの値が nil である可能性があることが明らかにわかり、慎重に扱う必要があります。
2. Optional型の実装
var optionalInteger: Int?
//或者
var optionalInteger: Int!
で?そして!すべてオプションの構文です
3. Optional型の本質
Optional は実際には列挙型 (厳密に言えば、列挙型とジェネリックスに基づく高次の抽象型である必要があります) であり、それぞれ None と Some(T) です。オプション型が nil の場合、Case of None がヒットします。
enum Optional<T> : NilLiteralConvertible, Reflectable {
case None
case Some(T)
//...
}
Some(T) の Case にヒットすると、「ラップされた」値 (ラップされた値) が得られます。実際の値を取得したい場合は、それを「アンパック」する必要があります。そうでない場合は、Optional(value )。
4. オプションタイプ(開梱設置)のお申込み
オプションのバインディング
オプションのバインディングを if ステートメントと while ステートメントで使用すると、オプションの型の値を評価し、その値を定数または変数に割り当てることができます。
オプションのバインディングを使用して、オプションに値が含まれているかどうかを判断できます。
これが含まれている場合は、自動的に解凍され、その値を一時定数 (let) または変数 (var) に代入して true を返し、それ以外の場合は false を返します。
基本的な構文:
if let constantName = someOptional {
statements
}
例:
var myString:String?
myString = "Hello, Swift!"
if let yourString = myString {
print("myString 值为 - \(yourString)")
}else{
print("myString 值为 nil")
}
強制解凍
オプションで、他のタイプのパッケージの層を追加できます。これは箱として理解できます。
- nilの場合、それは空のボックスです
- nil でない場合、ボックスにはラップされた型のデータが含まれます。
- Optional からラップされたデータを取り出したい場合は、感嘆符を使用する必要があります。強制解凍を実行する
- 値が nil の Optional を強制的に解凍すると、実行時エラーが発生します。
var myString:String?
myString = "Hello, world!"
if myString != nil {
// 强制解析
print( myString! )
}else{
print("myString 值为 nil")
}
オプションの型を他の型に直接割り当てることはできません。たとえば、Int? を Int 型の変数に直接割り当てることはできません。最初にそれらをアンパックする必要があります。値が nil のオプションの型はアンパックできません。
var text: String? = "abc"
print(text) //输出结果为Optional("abc")
print(text!) //输出结果为abc
var a:String
a = text! //强制解包
暗黙的な解凍
暗黙的なアンパックは定義時に直接追加されます。
viewDidLoad で初期化される変数については、var str: String! として直接定義できますが、これは暗黙的なアンパックと呼ばれますが、操作を実行するときにアンパックするために! を追加する必要もあります。
let text:String! = "abc" //text的类型还是Optional
print(text) //输出结果为Optional("abc")
var a:String
a = text //隐式类型转换
print(a) //输出结果为abc
! と ? の違い
? 使用シナリオ:
- 任意の値の変数を宣言する
- オプションの値を操作する場合、後続の操作に応答できるかどうかを判断するために使用されます。
!使用シナリオ:
- オプションの値を強制的に解凍する
- 暗黙的なアンパック変数を宣言します。通常はクラスの属性に使用されます。