[Swift] κ³ μ°¨ν•¨μˆ˜

parkgyurimΒ·2022λ…„ 5μ›” 14일
1

Swift

λͺ©λ‘ 보기
3/8
post-thumbnail

κ³ μ°¨ν•¨μˆ˜ (Higher-Order Function)

πŸ“Œ 인자 (Argument) 둜 ν•¨μˆ˜λ₯Ό 전달 λ°›κ±°λ‚˜ μ‹€ν–‰ 결과둜 ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜

Swift 의 ν•¨μˆ˜ (ν΄λ‘œμ €) λŠ” 일급 κ°μ²΄μ΄λ―€λ‘œ ν•¨μˆ˜μ˜ 인자둜 ν•¨μˆ˜λ₯Ό 전달할 수 있고 μ‹€ν–‰ 결과둜 ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
β†’ 즉, κ³ μ°¨ν•¨μˆ˜ κ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€!!

일급 객체 (일급 μ‹œλ―Ό)

"λ‹€λ₯Έ 객체듀에 일반적으둜 적용 κ°€λŠ₯ν•œ 연산을 λͺ¨λ‘ μ§€μ›ν•˜λŠ” 객체λ₯Ό 가리킨닀.
보톡 ν•¨μˆ˜μ— 인자둜 λ„˜κΈ°κΈ°, μˆ˜μ •ν•˜κΈ°, λ³€μˆ˜μ— λŒ€μž…ν•˜κΈ° 와 같은 연산을 지원할 λ•Œ 일급 객체라고 ν•œλ‹€."

μœ„ν‚€ λ°±κ³Ό - 일급 객체

κ³ μ°¨ ν•¨μˆ˜ λŠ” μ»¨ν…Œμ΄λ„ˆ νƒ€μž… (Array, Set, Dictionary λ“±) 에 μ‚¬μš©λ  수 있고, 이듀이 가진 각 μš”μ†Œμ— λŒ€ν•΄ λ™μž‘ν•©λ‹ˆλ‹€.

Swift ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œλŠ” map, compactMap, flatMap, reduce, filter, contains, sorted, forEach, removeAll 등을 μ œκ³΅ν•˜κ³  있으며, 일반적으둜 ν›„ν–‰ ν΄λ‘œμ € (Trailing Closure) λ₯Ό μ‚¬μš©ν•΄μ„œ ν‘œν˜„ν•©λ‹ˆλ‹€.

이 μ€‘μ—μ„œ λŒ€ν‘œμ μΈ map, filter, reduce λ₯Ό ν•œλ²ˆ 닀루어 λ³΄κ² μŠ΅λ‹ˆλ‹€!


Map

λ³€ν˜•

Returns an array containing the results of mapping the given closure over the sequence’s elements.

πŸ”— https://developer.apple.com/documentation/swift/sequence/3018373-map

map은 μ „λ‹¬λœ ν΄λ‘œμ €λ‘œ λ³€ν˜•ν•œ 객체λ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.

var floatNumbers : [Float] = [1.0, 2.0, 3.5, 4.0]
var integerNumbers : [Int] = floatNumbers.map { (num : Float) -> Int in 
  								return Int(num) 
  							 }
  
print(integerNumbers) // [1, 2, 3, 4]

map 의 인자둜 ν΄λ‘œμ €κ°€ μ „λ‹¬λ˜μ—ˆκ³  ν΄λ‘œμ €λ‚΄μ—μ„œ λ°°μ—΄ 각 μš”μ†Œμ— λŒ€ν•΄ ν˜•λ³€ν™˜μ΄λœ μ •μˆ˜ 배열을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ¬Όλ‘  ν΄λ‘œμ €μ—μ„œ 자주 μ“°λŠ” νƒ€μž… μΆ”λ‘ , 리턴 ꡬ문 μƒλž΅, νŒŒλΌλ―Έν„° 이름 μƒλž΅ 으둜 더 κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

var integerNumbers : [Int] = floatNumbers.map { Int($0)! }

이걸 일반적으둜 μ‚¬μš©ν•˜λŠ” for-loop 둜 ν‘œν˜„ν•˜λ©΄ 쑰금 더 κΈΈκ³  λ³΅μž‘ν•œ μ½”λ“œλ‘œ λ°”λ€Œκ² μ£ ?

var floatNumbers : [Float] = [1.0, 2.0, 3.5, 4.0]
var integerNumbers : [Int] = []

for num in floatNumbers {
	integerNumbers.append(Int(num))
}

Filter

쑰건을 λ§Œμ‘±ν•˜λŠ” μš”μ†Œ μΆ”μΆœ

Returns an array containing, in order, the elements of the sequence that satisfy the given predicate.

πŸ”— https://developer.apple.com/documentation/swift/sequence/3018365-filter

filterλŠ” μ „λ‹¬λœ ν΄λ‘œμ €μ˜ 쑰건을 λ§Œμ‘±ν•˜λŠ” 객체λ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.
filter둜 μ „λ‹¬λ˜λŠ” ν΄λ‘œμ €μ˜ 리턴 νƒ€μž…μ€ Bool 이며 true일 경우 ν•΄λ‹Ή μš”μ†Œλ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.

var numbers : [Int] = Array(1...10)
var evenNumbers : [Int] = numbers.filter { $0 % 2 == 0 }

print(evenNumbers) // [2, 4, 6, 8, 10]

Reduce

λˆ„μ , κ²°ν•©

Returns the result of combining the elements of the sequence using the given closure.

πŸ”— https://developer.apple.com/documentation/swift/sequence/2907677-reduce

reduce λŠ” μ΄ˆκΈ°κ°’κ³Ό ν΄λ‘œμ €, 두 개의 νŒŒλΌλ―Έν„°λ₯Ό 전달받고
각 μš”μ†Œμ— λŒ€ν•˜μ—¬ ν΄λ‘œμ € λ‚΄μ—μ„œ μ²˜λ¦¬ν•˜μ—¬ μ΄ˆκΈ°κ°’μ— λˆ„μ ν•˜μ—¬ κ²°ν•©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

var numbers : [Int] = [1, 2, 3, 4, 5]
var factorialNum : Int = numbers.reduce(1) { (result : Int, num : Int) -> Int
												return result *= num
                                           }
print(factorialNum) // 120

이처럼 배열을 μˆœνšŒν•˜λ©° 각 μš”μ†Œμ— λŒ€ν•΄ λˆ„μ ν•˜μ—¬ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

var factorialNum : Int = numbers.reduce(1) { $0 *= $1 }

Swift μ—μ„œλŠ” μ—°μ‚°μž μ—­μ‹œ 두 개의 νŒŒλΌλ―Έν„°λ₯Ό λ°›λŠ” ν•¨μˆ˜μ΄λ―€λ‘œ μ•„λž˜μ™€ 같이 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

var factorialNum : Int = numbers.reduce(1, *)

마무리

κ·Έλž˜μ„œ κ³ μ°¨ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ 뭐가 μ’‹μ„κΉŒμš”?

  • κ°„κ²°ν•œ μ½”λ“œ
    가끔 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ—μ„œ λ‚˜λŠ” 20쀄인데 ν•œμ€„μ§œλ¦¬ λ‹€λ₯Έ μ‚¬λžŒ 풀이 보고 λ†€λž€μ  μžˆλ‹€ μ—†λ‹€..?
    μ½”λ“œμ˜ 길이가 μ§§μ•„μ§€λŠ” 것 뿐만 μ•„λ‹ˆλΌ 깔끔해지고 가독성이 μ’‹μ•„μ§€λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
  • μž¬μ‚¬μš©
    κ³ μ°¨ ν•¨μˆ˜μ˜ μ „λ‹¬λ˜λŠ” ν΄λ‘œμ €λ₯Ό μž¬μ‚¬μš©ν•  ν•„μš”κ°€ μžˆμ„ 경우, λ³€μˆ˜μ— ν΄λ‘œμ €λ₯Ό μ €μž₯ν•˜κ³  μž¬μ‚¬μš©!
  • 컴파일러 μ„±λŠ₯
    컴파일 μ΅œμ ν™” μ„±λŠ₯이 더 μ’‹λ‹€.
    ν•˜μ§€λ§Œ μ‹œκ°„ λ³΅μž‘λ„ (Time Complexity) μΈ‘λ©΄μ—μ„œλŠ” μ„±λŠ₯ ν–₯상이 μ—†μŠ΅λ‹ˆλ‹€. β†’ O(n)

μ˜€λŠ˜μ€ κΉ”λ”ν•˜κ³  κ°„κ²°ν•œ 코딩을 ν•  수 있게 ν•΄μ£ΌλŠ” Swift 의 κ³ μ°¨ν•¨μˆ˜μ— λŒ€ν•΄ μ•Œμ•„λ΄€μŠ΅λ‹ˆλ‹€.
μœ„μ˜ λŒ€ν‘œμ μΈ 3가지 이외에도 Swift μ—λŠ” μœ μš©ν•œ κ³ μ°¨ν•¨μˆ˜λ“€μ΄ λ§Žμ€λ° ν•œλ²ˆ λ‘˜λŸ¬λ³΄μ‹œκΈΈ μΆ”μ²œν•©λ‹ˆλ‹€!

Apple Swift Documentation - Sequence
https://developer.apple.com/documentation/swift/sequence

ν‹€λ¦° 정보 λ˜λŠ” κΆκΈˆν•œ 점이 μžˆλ‹€λ©΄ λŒ“κΈ€ λΆ€νƒλ“œλ¦½λ‹ˆλ‹€! μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€β€ΌοΈ

0개의 λŒ“κΈ€