Optionals


❓Optionals

  • 값이 없다.
  • フォーマット
  • は、値
  • を必要としません.
    let num: Int // type annotaion 으로 자료형 지정
    print(num) // 저장된 값이 없음 

    なぜオプションが必要ですか?

  • ex)ネットワークからデータを受信した場合、接続されていないか切断されている場合は、値を正しく記憶できません
    ->値が保存されていない場合、接近時にエラーが発生します
    ->傍観者を使用してこの問題を処理する
  • オプションタイプをnilに初期化するにはtypeコメントが必要ですlet optionalNum: Int? = nil

    Optional Binding


    バインドは何ですか?
    →具体的な価値・性質を特定する.に値を付ける
    var num: Int? = nil
    print(num!) // 값 강제 추출
    
    /*binding */
    if let name:TYPE = EXP {}  //값이 있을 때만 binding
    if num != nil {
       print(num!}  //강제 추출  num은 optionalInt
    }
    
    /*위와 같음*/
    if let n = num {  // unwrapping 돼서 바인딩 됨  
       print(n)   // n은 Int n. (num 변수랑 같은 이름이어도 됨)
    }
    
    guard let num = num else{} // 이후 구문에서 num 사용 !!!!
  • 複数の変数バインド→すべてのバインドが成功した場合のみ、
  • は条件を満たす場合のみ
    let a: Int? = 12
    let b: String? = "str"
    if let num = a, let str = b, str.count > 5 {} // 모든 바인딩이 성공한 경우에만 바인딩 성공!!

    Implicitly Unwrapped Optionals

    !→自動抽出のオプション.強制抽出不確定値の存在
    let num: Int! = 12
    let a = num // a는 optional Int ,형식추론을 하는 경우에는 자동으로 추출되지 않음
    
    let b: Int = num // num이 Int? 면 에러나서 대입할 때 ! 해줘야함 
    実際によく使うわけではありません.nonoptionalを入れると自動的に抽出され、optionalに直接書き込まれます

    Optional Chaining


    簡単に言えば、optionalを連続的に呼び出す
  • の結果は、常にオプションの
  • である.
  • 式の1つがnilを返す場合、後続式をチェックすることなくnil
  • を返す.
  • 戻りフォーマットは、最後の式によって決定されます.
    var optionalP: Person? = Person(name: "jame", email: "[email protected]")
    let b = optionalP?.contacts.name
    // -> b의 자료형은 string 이 아닌 optional string
  • メソッドがoptionalを返す場合、カッコの後ろは?貼り付け(かっこの前にある場合、関数自体が空)
  • getFunction()?.value // method 가 optional 을 return
    let f: (() -> Person?)? = p.getFunction // 함수 자체가 optional
    f?()?.vlaue // 괄호 앞에 ? 붙임
  • は値を返し、valueを使用して属性にアクセスするか、何をしますか?
  • を貼り付ける必要があります
    var num = address["citi"]?.count

    Optional Pattern


    傍観者は列挙型として現れ、ケースといくつかのケースはない.
    if let x = a {} 
    // == 
    if case .some(let x) = a {} 
    // == enumeration case pattern + optional pattern
    if case let x? = a { //optional version  identifier 뒤에 물음표 붙임
       print(x) 
       // a상수에 값이 있으면 x 에 할당, binding 되고 실행됨, 바인딩되는 시점에 unwrapped
    }