iOS프로그래밍기초(Smile Han)/문법 정리

[Swift] 문법 정리 - 옵셔널 체이닝(Optional Chaining)

wse46 2024. 11. 24. 23:20
https://youtu.be/R8OWOgCNt4M?si=bldau6gYEZ3seGj2

위 영상을 보고 정리한 글입니다. (37:05 ~ 39:30)

 

 

 

 

print(_:seperator:terminator:)

print("일 이 삼")
print("1 2 3")
print(1, 2, 3)
print(1.0, 2.0, 3.0)
print(1, 2, 3, separator: "...")
for n in 1...3 {
    print(n)
}
for n in 1...3 {
    print(n, terminator: " ")
}
  • 출력값
    일 이 삼
    1 2 3
    1 2 3
    1.0 2.0 3.0
    1...2...3
    1
    2
    3 
    1 2 3

 

forced unwrapping

var x : Int
x = 10
if x != nil {
    print(x!)
}
else {
    print("nil")
}
var x1 : Int?
if x1 != nil {
    print(x1!)
}
else {
    print("nil")
}

 

 

옵셔널을 언래핑하는 여러가지 방법

var x : String? = "Hi"
print(x!)
if let a = x {
    print(a)
}
let b = x?.count
print(b!)

let c = x ?? ""
print(c)
  • Forced unwrapping - unsafe.
    x!
  • Optional binding - safe.
    if let a = x {
        print(a)
    }
  • Optional chaning - safe.
    let b = x?.count
  • Nil coalescing operator - safe.
    let x = x ?? ""

 

Optional Chaining 쓰는 이유

  • 옵셔널 타입으로 정의된 값이 프로퍼티나 메서드를 가지고 있을 때, 다중 if를 쓰지 않고 간결하게 코드를 작성하기 위해
  • 옵셔널 타입의 데이터는 연산이 불가능함
  • 연산을 하기 위해서는 옵셔널을 해제 해야 하는데, 많은 양의 옵셔널 타입의 데이터의 경우 다시 한 번 옵셔널 타입으로 변경을 하면서 해제를 시켜줌
if let s = p.sns {
    if let f = s.fb {
        print("\(f.account)")
    }
}
print("\(p.sns!.fb!.account)")
print("\(p.sns?.fb?.account)") // 옵셔널 체인, 옵셔널 타입이 됨

 

 

Optional Chaining 예

  • 옵셔널의 프로퍼티나 메서드 호출 뒤에 "?" 사용
    선언할 때는 자료형 뒤에 "?" (Int?)
  • (pLocation?.coordinate.latitude)!
  • tabBarController?.selectedIndex = 1
  • cell.textLabel?.text = items[(indexPath as NSIndexPath).row]
  • rectangleAdView?.delegate = self
  • audioPlayer?.volume = columeControl.value
  • audioRecorder?.recording
  • audioRecorder?.record()
  • locationManager?.requestWhenInUseAutorization()

 

  • 옵셔널 요소 내부의 프로퍼티로 옵셔널이 연속적으로 연결되는 경우 유용
  • 클래스나 구조체 안에 또 다른 클래스나 구조체 인스턴스가 있을 때 인스턴스를 점으로 연속해서 접근
  • 프로퍼티가 옵셔널인 경우 nil인지 아닌지 매번 체크를 해야하므로 번거로움
class Person {
    var age : Int = 1
    var addr : Address?
}
class Address {
    var city = "Seoul"
}
let kim = Person() // kim의 addr은 nil로 초기화
print(kim.addr!.city) // crash, 강제 언래핑
print(kim.addr?.city) // nil, 옵셔널 체이닝하면 최종 결과가 옵셔널로 나옴, 결과가 없으면 nil

 

 

Optional chain 예제

class Person {
    var name : String?
    var age : Int?
    var sns : SNS()
}
class SNS {
    var fb : FaceBook? = FaceBook()
    var tt : Twitter?
}
class FaceBook {
    var account : String = "aaa@bbb.com"
}
class Twitter {
    var account : String = ""
}

let p = Person()

if let s = p.sns {
    if let f = s.fb {
        print("1:\(f.account)")
    }
}

if let account = p.sns?.fb?.account {
    print("2: \(account)")
}
print("3: \(p.sns?.fb?.account)!)")
print("4: \(p.sns!.fb!.account)")

//print("5: \(p.sns?.tt?.account)") // nil
//print("6: \(p.sns!.tt!.account)") // 오류