iOS/Swift

[Swift] μ˜΅μ…”λ„(Optional)에 λŒ€ν•΄μ„œ

κ²½ν‘Έ 2023. 3. 17. 18:30
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”~

 

μ˜€λŠ˜μ€ μ˜΅μ…”λ„μ— λŒ€ν•΄μ„œ μ •λ¦¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

 

1. μ˜΅μ…”λ„μ˜ κ°œλ…

μ˜΅μ…”λ„μ€ μŠ€μœ„ν”„νŠΈμ—μ„œ 값이 μžˆμ„ μˆ˜λ„ 있고, 없을 μˆ˜λ„ μžˆλŠ” μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” νƒ€μž…μž…λ‹ˆλ‹€. 

λ‹€μ‹œ λ§ν•΄μ„œ λ³€μˆ˜λ‚˜ μƒμˆ˜κ°€ nil일 μˆ˜λ„ μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

 

선언방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

var optionalInt: Int? // Int νƒ€μž…μ˜ μ˜΅μ…”λ„ λ³€μˆ˜
var optionalString: String? // String νƒ€μž…μ˜ μ˜΅μ…”λ„ λ³€μˆ˜

 

μœ„μ— μ˜ˆμ‹œμ²˜λŸΌ μ˜΅μ…”λ„ λ³€μˆ˜ μ„ μ–Έ μ‹œμ—λŠ” μžλ£Œν˜• 뒀에 λ¬ΌμŒν‘œλ₯Ό λΆ™μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€.

 

2. μ˜΅μ…”λ„ μ‚¬μš©λ°©λ²•

μ•žμ„œ μ„€λͺ…ν•œ κ²ƒμ²˜λŸΌ μ˜΅μ…”λ„μ€ 값이 μžˆμ„ μˆ˜λ„, 없을 μˆ˜λ„ 있기 λ•Œλ¬Έμ— μ‚¬μš©ν•  λ•ŒλŠ” λ°˜λ“œμ‹œ 값이 μ‘΄μž¬ν•˜λŠ”μ§€ ν•˜μ§€ μ•ŠλŠ”μ§€ 확인을 ν•΄μ•Ό ν•©λ‹ˆλ‹€. 

 

μ΄λ•Œ, μ‚¬μš©ν•˜λŠ” 방법은 크게 4가지가 μžˆμŠ΅λ‹ˆλ‹€.

 

(1) μ˜΅μ…”λ„ 바인딩

μ˜΅μ…”λ„ 바인딩은 μ˜΅μ…”λ„μ— 값이 μ‘΄μž¬ν•˜λŠ”μ§€λ₯Ό ν™•μΈν•˜κ³ , 값이 μ‘΄μž¬ν•  경우 값을 λ³€μˆ˜ λ˜λŠ” μƒμˆ˜μ— ν• λ‹Ήν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

보톡 if let, guard let ꡬ문을 μ΄μš©ν•˜μ—¬ 값을 ν• λ‹Ήν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€.

 

var optionalInt: Int? = 10
if let intValue = optionalInt {
    print("optionalInt의 값은 \(intValue)μž…λ‹ˆλ‹€.")
} else {
    print("optionalIntμ—λŠ” 값이 μ—†μŠ΅λ‹ˆλ‹€.")
}

 

μœ„μ˜ μ½”λ“œμ—μ„œλŠ” optianalInt의 값이 μ‘΄μž¬ν•œλ‹€λ©΄ intValue에 값이 ν• λ‹Ήλ˜κ³  ν•΄λ‹Ή 블둝을 μ‹€ν–‰ν•˜κ²Œ 되고 λ§Œμ•½ nil이라면 else 블둝을 μ‹€ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

(2) μ˜΅μ…”λ„ 체이닝

μ˜΅μ…”λ„ 체이닝은 μ˜΅μ…”λ„ λ³€μˆ˜, λ©”μ„œλ“œμ— μ ‘κ·Όν•  λ•Œ μ‚¬μš©ν•˜λŠ”λ° ν•΄λ‹Ή 값이 nil인 경우 nil을 λ°˜ν™˜ν•˜κ²Œ 되고, 값이 μ‘΄μž¬ν•œλ‹€λ©΄ μ ‘κ·Όν•˜μ—¬ ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œμ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

var optionalStr: String? = "μ•ˆλ…•ν•˜μ„Έμš”! λ°˜κ°‘μŠ΅λ‹ˆλ‹€~"
if let count = optionalStr?.count {
    print("optionalStr은 \(count)개의 문자λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€.")
} else {
    print("optionalStrμ—λŠ” 값이 μ—†μŠ΅λ‹ˆλ‹€.")
}

 

μ˜΅μ…”λ„ 체이닝을 톡해 optionalStr의 count ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜κ³  μžˆλŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€. μ•žμ„œλ§μ”€λ“œλ¦° κ²ƒμ²˜λŸΌ nil이라면 else 블둝을 μ§„ν–‰ν•˜κ³  nil이 μ•„λ‹ˆλΌλ©΄ count에 μ ‘κ·Όν•΄ count λ³€μˆ˜μ— ν• λ‹Ήν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

(3) nil 병합 μ—°μ‚°μž

nil 병합 μ—°μ‚°μžλŠ” ??λ₯Ό μ΄μš©ν•˜μ—¬ nil일 경우 기본값을 λ°˜ν™˜ν•˜λŠ” μ—°μ‚°μžμž…λ‹ˆλ‹€. 

 

var optionalStr: String? = nil
let str = optionalStr ?? "μ•ˆλ…•ν•˜μ„Έμš”! λ°˜κ°‘μŠ΅λ‹ˆλ‹€~"
print(str) // 좜λ ₯ κ²°κ³Ό: "μ•ˆλ…•ν•˜μ„Έμš”! λ°˜κ°‘μŠ΅λ‹ˆλ‹€~"

 

(4) κ°•μ œ μ–Έλž˜ν•‘

κ°•μ œ μ›λž˜ν•‘μ€ μ˜΅μ…”λ„ 값이 nil인 경우, λŸ°νƒ€μž„ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€μ§€λ§Œ 값이 μ‘΄μž¬ν•œλ‹€λ©΄ ν•΄λ‹Ή 값을 λ°˜ν™˜ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλŠ” λ°©λ²•μž…λ‹ˆλ‹€.

λŸ°νƒ€μž„ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€κΈ° λ•Œλ¬Έμ— κ°€λŠ₯ν•œ 지양해야 ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

 

var optionalInt: Int? = 10
let intValue = optionalInt!
print("optionalInt의 값은 \(intValue)μž…λ‹ˆλ‹€.")

var optionalInt: Int?
let intValue = optionalInt! // λŸ°νƒ€μž„ μ—λŸ¬

 

3. μ˜΅μ…”λ„ μ‚¬μš© μ˜ˆμ‹œ

μ˜΅μ…”λ„μ„ μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” λ§Žμ§€λ§Œ

κ°„λ‹¨ν•œ μ˜ˆμ‹œλ‘œ restAPIλ₯Ό ν˜ΈμΆœν•  λ•Œ, μ„œλ²„μ—μ„œ 온 응닡값을 μ²˜λ¦¬ν•˜λŠ” μ˜ˆμ‹œλ₯Ό λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

func fetchDatas(completion: @escaping (String?) -> Void) {
    // URLSession 객체 생성
    let session = URLSession.shared
    
    // URL 객체 생성
    guard let url = URL(string: "https://api/data") else {
        completion(nil) // URL이 μœ νš¨ν•˜μ§€ μ•ŠμœΌλ©΄ nil λ°˜ν™˜
        return
    }
    
    // URLRequest 객체 생성
    let request = URLRequest(url: url)
    
    // URLSessionDataTask 객체 생성
    let task = session.dataTask(with: request) { (data, response, error) in
        // 응닡이 μ •μƒμ μœΌλ‘œ 왔을 λ•Œ
        if error == nil {
            // μ˜΅μ…”λ„ 바인딩을 톡해 dataκ°€ nil인지 확인
            if let data = data {
               // nil이 μ•„λ‹ˆλΌλ©΄ 결과값을 ν• λ‹Ή
                let result = String(data: data, encoding: .utf8)
                completion(result) // κ²°κ³Ό λ°˜ν™˜
            } else {
                completion(nil) // 데이터가 μœ νš¨ν•˜μ§€ μ•Šμ„ 경우 nil λ°˜ν™˜
            }
        } else {
            completion(nil) // μ—λŸ¬ λ°œμƒ μ‹œ nil λ°˜ν™˜
        }
    }
    
    task.resume()
}

 

μœ„μ˜ μ½”λ“œμ—μ„œ dataλ₯Ό μ˜΅μ…”λ„ 바인딩을 톡해 nil μ—¬λΆ€λ₯Ό νŒλ‹¨ν•˜κ³  nil이 μ•„λ‹ˆλΌλ©΄ completion을 톡해 데이터λ₯Ό λ„˜κ²¨μ£Όκ³  μžˆλŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 쒋은 μ˜ˆμ‹œκ°€ λ˜μ—ˆμœΌλ©΄ μ’‹κ² λ„€μš”.

 

μ˜€λŠ˜μ€ μ˜΅μ…”λ„μ— λŒ€ν•΄μ„œ 정리해 λ΄€μŠ΅λ‹ˆλ‹€.

그럼 이만 πŸ‘‹πŸ» πŸ‘‹πŸ» πŸ‘‹πŸ»

λ°˜μ‘ν˜•