Danny의 iOS 컨닝페이퍼
article thumbnail
Published 2022. 12. 27. 18:25
[iOS/Swift] 고차함수 Xcode/Swift 문법

“함수”를 파라미터로 사용하거나 “함수”를 리턴합니다. 각 데이터를 클로저로 보내 작업을 시킵니다.

map 함수

기존 배열의 각 Element를 새롭게 매핑해서 새로운 배열로 리턴하는 함수 (데이터를 변형할 때 사용합니다)
var numbers = [1, 2, 3, 4, 5]

var mapping = numbers.map { n in  
    return "숫자: \(n)"
}

var numMapping = numbers.map { $0 * 5 }
String형도 일종의 배열(데이터바구니)입니다.
  • String형의 map함수는 각각의 값을 Character형으로 변환시킨 후 배열로 반환합니다.
  • str = "1" + "2" + "3" + "4" + "5" 이렇게 각각의 element들을 뽑아서 배열로 만들 수 있습니다.
// str.map(transform: (Character) throws -> T)

let str = "12345"

var strMapping = str.map { n in
    let mapping = n.wholeNumberValue! * 5    // wholeNumberValue == Character형을 Int형 변환 키워드
    print(mapping)
}

// 5
// 10
// 15
// 20
// 25

 

filter 함수

배열의 각 Element를 확인 후, 조건에 따라 참이면(true) 그 Element를 반환합니다. (데이터를 필터 할 때 사용합니다)
let names = ["Apple", "Black", "Circle", "Dream", "Blue"]

var nameFilter = names.filter { str in
    return str.contains("B")
}  
// ["Black", "Blue"]

var countCharcter = names.filter { char in
    return char.count == 5
}  
// ["Apple", "Black", "Dream"]

-------------------------------------------------------------------------------------------------
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

var numFilter = numbers.filter { n in
    return n % 2 == 0
} 
// [2, 4, 6, 8, 10]

 

reduce 함수

배열의 각 Element들을 결합해서 하나의 결과값으로 리턴합니다. (데이터를 결합할 때 사용합니다)
// 초기값이 필요합니다

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]

var totalSum = numbers.reduce(0) { partialResult, n in
    return partialResult + n
}

// 45
// String형을 Charater형으로 변환시켜 한개씩 뽑아서 사용

let str1 = "123456789"

var totalCharSum = str1.reduce(0) { partialResult, char in
    partialResult + char.wholeNumberValue!
}  

// 45

 

forEach 함수

배열의 Element를 뽑아서 각 Element별로 특정 작업을 실행합니다.
                       for-in문과 동일하게 각각의 Element호출하지만 클로저 안에서 동작합니다.
let numbers = [1, 2, 3, 4, 5]

let changeArray: () = numbers.forEach { n in
    print("print: \(n)")
}

// 숫자: 1
// 숫자: 2
// 숫자: 3
// 숫자: 4
// 숫자: 5

 

compactMap 함수

배열의 각 Elemente을 새롭게 매핑하여 변형하되, 옵셔널 요소는 제거하고 새로운 배열을 리턴합니다.
compactMap == (map + 옵셔널 바인딩)
let stringArray: [String?] = ["A", nil, "B", nil, "C"]

var withoutNil = stringArray.compactMap { str in
    return str
}  
// ["A", "B", "C"]

let wholeNum = [-4, -3, -2, -1, 0, 1, 2, 3, 4]

var positiveNumbers = wholeNum.compactMap { n in
    return n > 0 ? n : nil
}  
// [1, 2, 3, 4]


// 중접 배열에선 의미가 없습니다.(효과가 없어요)
var nestedArray = [[1, nil, 3], [4, 5, 6], [7, nil, 9]]

print(nestedArray.compactMap({ arr in
    arr
}))
// [[Optional(1), nil, Optional(3)], [Optional(4), Optional(5), Optional(6)], [Optional(7), nil, Optional(9)]]

 

flatMap 함수

기존에는 1차원 배열에서는 compactMap과 같이 동일한 기능으로 쓰였지만 지금은 안 쓰이고,
                       2차원 배열(중접 배열)에서 내부의 배열을 제거 후 리턴하게 됩니다.
var nestedArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

print(nestedArray.flatMap { arr in
    arr
})
// [1, 2, 3, 4, 5, 6, 7, 8, 9]

var newNnestedArray = [[[1,2,3], [4,5,6], [7, 8, 9]], [[10, 11], [12, 13, 14]]]

var numbersArray = newNnestedArray.flatMap { $0 }
                                  .flatMap { $0 }
    
print(numbersArray) 
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

 

map, filter, reduce의 활용

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

// 위의 배열 중에, 홀수만 제곱해서, 그 숫자를 다 더한 값은?

var newResult = numbers.filter { $0 % 2 != 0 }
                       .map { $0 * $0 }
                       .reduce(0) { $0 + $1 }
print(newResult)

// 1, 9, 25, 49, 81 ===> 165

 

 

부족한 설명이지만, 조금은 이해 가셨나요?

틀린 내용이 있다면 언제든지 지적해 주시면 감사히 받겠습니다. 🫠
읽어주셔서 감사합니다 😃

 

반응형
profile

Danny의 iOS 컨닝페이퍼

@Danny's iOS

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!