Optional


Optionalとは?


SWIFTは、
  • 値が存在するか存在しないかを示す構文を提供する.
  • なぜ選択する必要があるのですか?


    プログラミング中に多くのエラーが発生します.Optionalが存在するのは、発生する可能性のあるエラーを最小化するためです.いずれの場合も、多くのエラーを安全に処理するために、有価と無価に分けることができます.
    たとえば、一部のデータに値がなく、プログラムでデータにアクセスしたときにエラーが発生する可能性があります.未然に防ぐために作られた文法といえる.
    「Optionalのベールにデータ値を隠す」という言い方がいいかもしれません.
    データは有価なのか無価なのか、実際のデータを利用するためには隠れた価格で使わなければなりません.
    この場合,4つの方法で囲まれた値に近づくことができる.
    オフセットバインド、オフセット、強制抽出、nil連結演算子

    Optional Binding


    if let構文でoptionalの値がnilであることを削除する場合は、構築中のブロックを実行し、nilである場合はelse構文またはif letブロックの外部のコードを実行します.
    guard let構文はif let構文とは逆に、optionalの値がnilである場合、else構文のブロックを実行します.そうしないと、次のコードが実行されます.
    では、if letはいつ書きますか.guard letはいつ書きますか.
    if let構文とguard letの最大の違いは、if let構文によるoptionalの値の除去がif letブロック内部でのみ利用可能であることである.
    ただしguard letの場合は、以降のコード行でも使用できます.
    func optionalBinding() {
    	if let optional을 벗긴 값 = optional을 벗길 값 {
        	// "optional을 벗길 값"이 nil이 아니라면
            // 여기서 "optional을 벗긴 값"을 사용할 수 있다.
    	}
        // 근데 여기서는 "optional을 벗긴 값"을 사용할 수 없다!
        
        guard let optional을 벗긴 값 = optional을 벗길 값 else {
        	// "optional을 벗길 값"이 nil일 경우 이 블록이 실행된다.
            return
    	}
        // "optional을 벗길 값"이 nil이 아닐 경우 이후 코드에서 "optional을 벗긴 값"을 사용할 수 있다.
    }

    Optional Chaining


    階層化された選択肢タイプでOptional Chaining、特に使用方法を使用する場合.
    struct Person {
    	var name: string
        var home: String?
    }
    
    let chuuuny: Person? = Person(name: "chuuuny", home: "서울")
    
    func optionalBinding() {
    	guard let chuuuny = chuuuny, let home = chuuuny.home else {
        	return
    	}
    }
    
    func optionalChaining() {
    	guard let home = chuuuny?.home else {
        	return
    	}
    }
    Optional BindingでZunyがどこに住んでいるかを知るためには、Zunyの家があるかどうか、家があればどんな家なのかを知る必要があります.(オプションBindingメソッド)
    しかし、上記の2つ以上の選択Bindingは、オプションを変更することによって簡潔に処理することができる.

    Nil Coalescing Operator


    Nil Collecting Operatorは、左側のオフセット値がnilの場合に代替値を指定できる演算子です.
    func nilCoalescingOperator() {
        // chuuny가 nil이라면 Person 객채를 새로 생성한다.
    	let chuuny = chuuny ?? Person(name: "chuuny", home: "경기도")
        
        // chuuny의 home이 nil이라면 chuuuny의 home을 "경기도" 으로 대체한다.
        let home = chuuny.home ?? "경기도"
    }

    Forced Unwrapping


    その名の通り、オプションで包んだ値があるかどうかを確認せずに、そのまま剥がす方法です.
    値をすばやく簡単に抽出できますが、剥がす値がnilの場合、ランタイムエラーが発生します.
    func forcedUnwrapping() {
    	let chuuuny = chuuuny!
        let home = chuuuny.home!
    }
    Forced Unwrapping普通は使わないでください!!

    比較オプション


    アマチュア学習で新しい面白いものを見つけた.
    let a: Int? = Optional(10)
    let b: Int = 10
    
    print(a == b) // true
    実際、上に表示されているのはtrue!

    オプショナルで包んだ価格と普通の価格をどう比較できますか?


    これはSWIFT Githubのオプション実装コードによって理解できる.
    Swift Github
    簡単に言えば、比較がオプションの値ではない場合は、オプションの値で包んで比較します!
    @inlinable
      public static func ==(lhs: Wrapped?, rhs: Wrapped?) -> Bool {
      	switch (lhs, rhs) {
        case let (l?, r?):
        	return l == r
        case (nil, nil):
        	// 둘다 nil인데 값이 true? 이건 좀 신기하네용 ㅋㅋ
          	return true
        default:
          	return false
    	}
    }