DEVELOPMENT/iOS AOS

[Swift] 공식 문서 요약 - The Basics_03

heeble 2023. 9. 13. 01:14
본 내용은 Swift 공식 문서에 기반하여 작성되었습니다.
https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

 

Optional [옵셔널] 

'값이 없을 수 있는 상황'에서 사용.

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// "123"은 Int로 변경 가능하나 "Hello, World"의 경우 Int로 변경 불가능
// 즉, 모든 String을 Int로 변경 가능하지 않음 -> return optional Int

nil [닐] 

optional 변수에서 값이 없을 때를 표현

var serverResponseCode: Int? = 404
// serverResponseCode 는 Optional Int. (Int에 ? 를 포함하여 선언시 optional로 취급)
serverResponseCode = nil
// serverResponseCode는 이제 값이 없는 변수. nil의 경우 optional이 아닌 변수에 사용 불가능.

var surveyAnswer: String?
// 변수가 자동으로 nil로 설정

If Statements and Forced Unwrapping [If 문 그리고 강제 풀기]

nil 값에 대한 처리1

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)

if convertedNumber != nil {
    print("convertedNumber has an integer value of \(convertedNumber).")
    print("convertedNumber has an integer value of \(convertedNumber!).")
}
// 결과값 : "convertedNumber has an integer value of 123."

 

// "123"의 경우 정수형으로 형변환이 가능한 문자형이다.

// 그러나 특성상 convertedNumber의 경우 Optional(123)을 반환하게 되므로 이를 '!'를 이요하여 강제로 Unwrapping 해준다.

// 실제로 Xcode playground에서 프린트해보면 아래와 같은 결과를 얻을 수 있다. 

// 첫 번째 '!'로 강제 Unwrapping을 해주지 않는 코드의 경우 Optional(123)이 리턴되고 있으며, 강제 Unwrapping을 해준 경우 제대로 정수형으로 인쇄된다. 

 


Optional Binding [옵셔널 바인딩]

nil 값에 대한 처리2

// optional에 값이 포함되어 있는지 확인 후 상수나 변수에 바인딩

if let actualNumber = Int(possibleNumber) {
    print("The string \"\(possibleNumber)\" has an integer value of \(actualNumber)")
} else {
    print("The string \"\(possibleNumber)\" could not be converted to an integer")
}
// 결과값 : "The string "123" has an integer value of 123"

// possibleNumber에 적절한 값이 들어와 있는 경우 제대로 바인딩 되어 if 문이 실행되고, "Hello, World" 같은 적절하지 않은 값(예를들어, Integer로 변경할 수 없는 값)이 들어와 있는 경우 반인딩 되지 않으므로 else 문이 실행된다. 

 

if let firstNumber = Int("4") {
    if let secondNumber = Int("42") {
        if firstNumber < secondNumber && secondNumber < 100 {
            print("\(firstNumber) < \(secondNumber) < 100")
        }
    }
}
if let firstNumber = Int("4"),
   let secondNumber = Int("42"),
   firstNumber < secondNumber && secondNumber < 100 {
    print("\(firstNumber) < \(secondNumber) < 100")
}

// 첫 번째 경우와 같이 여러 개의 if let 조건과, 기타 조건을 아래와 같이 한 번에 적용하여 사용할 수 있다. (많은 Optional Binding과 Boolean Condition 포함 가능)

 


Implicitly Unwrapped Optionals

// 구조상 nil 값이 들어오지 '않는' 경우에 Unwrapped Optionals를 사용 (An optionals always have a value)

let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // Forced Unwrapping이 필요

let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // Unwrapping 필요 없음

 

// 첫 번째 Optional String의 경우와 달리 Implicitly Unwrapped Optionals를 사용하면 Forced Unwrapping 없이 즉시 사용 가능

if assumedString != nil {
    print(assumedString!)
}
// Prints "An implicitly unwrapped optional string."
if let definiteString = assumedString {
    print(definiteString)
}
// Prints "An implicitly unwrapped optional string."

// Normal Optionals와 동일한 방법으로 nil check 가능