관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] Optional 타입에 map 사용하기(Synthetic Sugar) 본문

iOS 응용 (swift)

[iOS - swift] Optional 타입에 map 사용하기(Synthetic Sugar)

jake-kim 2024. 7. 24. 01:07

* Synthetic Sugar: 결과는 같지만, 코드를 조금 더 단순하게 표현하는 것

Optional 타입에 map 사용하기

  • 보통 map 함수를 배열과 같은곳에 원소를 하나씩 돌면서 변화를 줄 때 사용
let items = [1,2,3,4,5]
let itemsWithPlusOne = items.map { $0 + 1 }
  • 하지만 Optional 타입에도 map을 사용이 가능
    • Swift 코드를 보면 Optional에 map 함수가 정의
    • Optional인 타입의 메소드이며, 이 map을 사용하면 Optional을 벗겨낸 값을 map의 클로저로 전달한 인수로 들어가는 것
@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {
    @inlinable public func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U?
}

map으로 Optional 다루기 예제

  • Person이라는 class타입 모델이 있고, person을 업데이트 하는 코드가 아래처럼 있을때, updatePerson해야하는 상황
  • (person은 Optional타입)
  • updatePerson에서 person은 Optional이 아니어야 하므로 사용하는쪽에서는 if let으로 person을 optional binding하여 사용
class ViewController: UIViewController {
    var person: Person? = Person(name: "jake", age: 20)
        
    func updatePerson(person: Person) {
        let currentAge = person.age
        person.age = currentAge + 1
    }
        
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let person {
            updatePerson(person: person)
        }
    }
}
  • map을 사용하면 Optional binding없이 한 줄로 간편하게 처리가 가능
    • 여기에 map을 사용할 때 keyPath까지 사용하여 대괄호 없이 아래처럼 간결하게 표현이 가능
person.map(updatePerson(person:))
  • 만약 person이 nil이면 updatePerson은 실행되지 않기 때문에 if let person {...}과 똑같은 기능

* 전체코드: https://github.com/JK0369/ExSyntheticSugar

Comments