Swift Basic (5)

Harold's velog·2024년 1월 31일

iOSbasic

목록 보기
12/15

옵셔널 (Optional)

  • 값이 있을수도 있고, 없을수도 있기에 사용한다.
  • 필요한 이유 : nil의 가능성을 명시적으로 표현
    • nil의 가능성을 문서화 하지 않아도 코드만으로 충분히 표현이 가능하다.
      • 문서/주석 작성 시간을 절약한다
    • 전달받은 값이 옵셔널이 아니라면 nil체크를 하지 않더라도 안심하고 사용가능하다.
      • 효율적인 코딩이 가능
      • 예외 상황을 최소화하는 안전한 코딩이 가능.

예시

func someFunction(someOptionalParam : Int? ) {}
// ?를 띄워서 쓰면 안된다.
func someFunction(someParam : Int ) {}

someFunction(someOptionalParam : nil)
someFunction(someParam : nil) // Int타입이 nil이 될수 없으므로 에러가 발생한다.
  1. ! - Implicitly Unwrapped Optional (암시적 추출 옵셔널)
    예시
var implicitlyUnwrappedOptionalValue: Int! = 100

switch implicitlyUnwrappedOptionalValue {
case .none:
    print("This Optional variable is nil")
case .some(let value):
    print("Value is \(value)")
}

// 기존 변수처럼 사용 가능
implicitlyUnwrappedOptionalValue = implicitlyUnwrappedOptionalValue + 1

// nil 할당 가능
implicitlyUnwrappedOptionalValue = nil

// 잘못된 접근으로 인한 런타임 오류 발생
//implicitlyUnwrappedOptionalValue = implicitlyUnwrappedOptionalValue + 1 - 해당 부분은 위에 nil로 되어있는데 더해서 에러가 발생.
  1. ? - Optional (일반적인 옵셔널)
    예시
var optionalValue: Int? = 100

switch optionalValue {
case .none:
    print("This Optional variable is nil")
case .some(let value):
    print("Value is \(value)")
}

// nil 할당 가능
optionalValue = nil

// 기존 변수처럼 사용불가 - 옵셔널과 일반 값은 다른 타입이므로 연산불가
//optionalValue = optionalValue + 1

옵셔널 추출 (Optional Unwrapping)

  1. 옵셔널 바인딩 (Optional Binding)
    • 옵셔널의 값을 꺼내오는 방법 중 하나
    • nil 체크 + 안전한 값 추출
    • ?를 사용한다.

예시

func printName(_ name: String) {
    print(name)
}

var myName: String? = nil

//printName(myName) -> 전달되는 값의 타입이 다르기 때문에 컴파일 오류발생
// printName이라는 함수의 매개변수의 데이터형은 String인데, myName의경우 옵셔널이므로 에러가 발생한다.
  • if - let 이용한 옵셔널 바인딩.
    예시
func printName(_ name: String) {
    print(name)
}

if let name: String = myName {
    printName(name)
} else {
    print("myName == nil")
}

var yourName: String! = nil

if let name: String = yourName {
    printName(name)
} else {
    print("yourName == nil")
}

// name 상수는 if-let 구문 내에서만 사용가능

// ,를 사용해 한 번에 여러 옵셔널을 바인딩 할 수 있습니다
// 모든 옵셔널에 값이 있을 때만 동작합니다
myName = "yagom"
yourName = nil

if let name = myName, let friend = yourName {
    print("\(name) and \(friend)")
}
// yourName이 nil이기 때문에 실행되지 않는다.

yourName = "hana"

if let name = myName, let friend = yourName {
    print("\(name) and \(friend)")
}
// yagom and hana
  1. 강제추출 (Force Unwrapping)
    • !를 붙인다.
func printName(_ name: String) {
    print(name)
}

var myName : String? = "yagom"

printName(myName!) // yagom

myName = nil

//print(myName!)
// 강제추출시 값이 없으므로 런타임 오류 발생

yourName = nil

//printName(yourName)
// nil 값이 전달되기 때문에 런타임 오류발생
profile
데일리 정리, 하루에 최소 하나의 글은 적도록 하자.

0개의 댓글