iOS

Combine - Operator(map, compactMap, tryMap)

728x90

Operator

: Publisher가 subcriber에게 전달하는 데이터를 변환하는 작업을 중간에 할 수가 있음.

 

오늘 살펴볼 목록

  • map
  • compactMap
  • tryMap

map, compactMap, tryMap의 차이

  • 셋 모두 어떤 것에서 다른것으로 변환해주는 작업을 할 수 있다.
  • map
    let numbers = [1,2,3,4,5]
    let doubles = numbers.map{ $0 * 2 }
    
    let wizards = ["Harry", "Hermione", "Ron"]
    let uppercased = wizards.map{ $0.uppercased() }
    
    // Int로 변환이 불가능하다면,
    // Optional 정수가 반환됨.
    let maybeNumbers = wizards.map{ Int($0) } // [nil, nil, nil]
    
let numbers = [1,2,3,4,5]
let doubles = numbers.map{ $0 * 2 }

let wizards = ["Harry", "Hermione", "Ron"]
let uppercased = wizards.map{ $0.uppercased() }

// Int로 변환이 불가능하다면,
// Optional 정수가 반환됨.
let maybeNumbers = wizards.map{ Int($0) } // [nil, nil, nil]

 

  • compactMap (compact: 대략 경계 없이 무한히 뻗어나가지 않는 공간)
    • nil인 값은 반환해주지 않고, 무시함.
    let compactNumbers = wizards.compactMap{ Int($0) } // []
    
    • 이를 이용하여 Optional을 바인딩하는 과정을 생략 할 수 있음.
    let imageViews = view.subviews.compactMap { $0 as? UIImageView }
    let urls = urlStrings.compactMap { URL(string: $0 )}
    
    let possibleNumbers = ["1", "2", "three", "///4///", "5"]
    
    let mapped: [Int?] = possibleNumbers.map { str in Int(str) }
    // [1, 2, nil, nil, 5]
    
    let compactMapped: [Int] = possibleNumbers.compactMap { str in Int(str) }
    // [1, 2, 5]
    
  • tryMap
    • 에러가 발생 할 수 있는 상황에 사용하면서, 에러가 발생하면 중단하고 subscriber에게 Error가 발생 했음을 전달함.
    struct ParseError: Error {}
    func romanNumeral(from:Int) throws -> String {
        let romanNumeralDict: [Int : String] =
            [1:"I", 2:"II", 3:"III", 4:"IV", 5:"V"]
        guard let numeral = romanNumeralDict[from] else {
            throw ParseError()
        }
        return numeral
    }
    let numbers = [5, 4, 3, 2, 1, 0]
    cancellable = numbers.publisher
        .tryMap { try romanNumeral(from: $0) }
        .sink(
            receiveCompletion: { print ("completion: \\($0)") },
            receiveValue: { print ("\\($0)", terminator: " ") }
         )
    
    // Prints: "V IV III II I completion: failure(ParseError())"
    

 

 

 

 

반응형