λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

swift λ¬Έλ²•πŸ–€

[SWIFT] κ³ μ°¨ν•¨μˆ˜(Higher-order Function) map{}, filter{}, reduce{}, forEach{}, compactMap{}, flatmap{}

κ³ μ°¨ν•¨μˆ˜λž€?

ν•¨μˆ˜λ₯Ό νŒŒλΌλ―Έν„°λ‘œ μ‚¬μš©ν•˜κ±°λ‚˜, ν•¨μˆ˜μ˜ μ‹€ν–‰κ²°κ³Όλ‘œ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ f(f(x))

- Sequence, Collection ν”„λ‘œν† μ½œμ„ λ”°λ₯΄λŠ” μ»¬λ ‰μ…˜( λ°°μ—΄, λ”•μ…”λ„ˆλ¦¬,μ„ΈνŠΈ λ“±)에 기본적으둜 κ΅¬ν˜„λ˜μ–΄μžˆλŠ” ν•¨μˆ˜μ΄λ‹€ + Optional type도 κ΅¬ν˜„λ˜μ–΄ 있음

 

1) λ°°μ—΄.map { ν΄λ‘œμ € (ν•¨μˆ˜) } 

κΈ°μ‘΄ λ°°μ—΄ λ“±μ˜ 각 μ•„μ΄ν…œμ„ μƒˆλ‘­κ²Œ λ§€ν•‘ν•˜μ—¬ μƒˆλ‘œμš΄ 배열을 λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜
( λ°°μ—΄μ˜ μ•„μ΄ν…œμ„ ν•œκ°œμ”© λ˜μ Έμ£Όμ–΄ ν•¨μˆ˜ λ‚΄μ˜ ν•¨μˆ˜κ°€ μ‹€ν–‰ν•œλ‹€ )

 

let numbers = [1, 2, 3, 4, 5]

newNumbers = numbers.map { "숫자: \($0)" }

print(newNumbers)
μ‹€ν–‰ κ²°κ³Ό : ["숫자: 1", "숫자: 2", "숫자: 3", "숫자: 4", "숫자: 5"]

 

2) λ°°μ—΄.filter { ν΄λ‘œμ € -  μ‘°κ±΄ }

κΈ°μ‘΄ λ°°μ—΄ λ“±μ˜ 각 μ•„μ΄ν…œμ„ 쑰건을 확인 ν•œ ν›„ , trueλ₯Ό λ§Œμ‘±ν•˜λŠ” μ•„μ΄ν…œμ„ κ±ΈλŸ¬λ‚΄μ„œ μƒˆλ‘œμš΄ 배열을 λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜
( 각 μ•„μ΄ν…œμ„ ν•„ν„°λ§ν•΄μ„œ , κ±ΈλŸ¬λ‚΄ μƒˆλ‘œμš΄ 배열을 λ§Œλ“€λ•Œ μ‚¬μš© ) 
λ§Œμ•½ 쑰건에 λΆ€ν•©ν•˜λŠ”κ²Œ ν•˜λ‚˜λ„ μ—†λ‹€λ©΄, 빈 배열을 리턴

 

let names = ["Apple", "Black", "Circle", "Dream", "Blue"]

var newNames = names.filter { (name) -> Bool in
    return name.contains("B")
}
// containsλŠ” String에 이미 κ΅¬ν˜„λ˜μ–΄ μžˆλŠ” ν•¨μˆ˜

print(newNames)
μ‹€ν–‰ κ²°κ³Ό : ["Black", "Blue"]

 

3) λ°°μ—΄.reduce { ν΄λ‘œμ € }

κΈ°μ‘΄ λ°°μ—΄ λ“±μ˜ 각 μ•„μ΄ν…œμ„ ν΄λ‘œμ €κ°€ μ œκ³΅ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ²°ν•©ν•΄μ„œ λ§ˆμ§€λ§‰ 결과값을 λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ (μ΄ˆκΈ°κ°’ μ œκ³΅ν•  ν•„μš”μžˆμŒ) 
( 각 μ•„μ΄ν…œλ“€μ„ κ²°ν•©ν•˜μ—¬ ν•˜λ‚˜μ˜ κ°’μœΌλ‘œ 리턴 )

 

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

var resultSum = numbersArray.reduce(0) { (sum, num) in
    return sum + num
}

print(resultSum)
μ‹€ν–‰ κ²°κ³Ό : 55

 

4) λ°°μ—΄.forEach { ν΄λ‘œμ € }

κΈ°μ‘΄ λ°°μ—΄ λ“±μ˜ 각 μ•„μ΄ν…œμ„ ν™œμš©ν•˜μ—¬ 각 μ•„μ΄ν…œμ„ ν™œμš©ν•˜μ—¬ νŠΉμ •μž‘μ—…μ„ μ‹€ν–‰ν•œ κ²°κ³Ό 배열을 λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜
(각 μ•„μ΄ν…œμ„ ν™œμš©ν•΄μ„œ 각각 νŠΉμ • μž‘μ—…μ„ μ‹€ν–‰ν• λ•Œ μ‚¬μš©)

 

let immutableArray = [1, 2, 3, 4, 5]




immutableArray.forEach { num in
    print(num)
}


immutableArray.forEach { print("숫자: \($0)") }
μ‹€ν–‰ κ²°κ³Ό : 
숫자: 1
숫자: 2
숫자: 3
숫자: 4
숫자: 5

5) λ°°μ—΄.compactMap { ν΄λ‘œμ € }

κΈ°μ‘΄ λ°°μ—΄ λ“±μ˜ 각 μ•„μ΄ν…œμ„ μƒˆλ‘­κ²Œ λ§€ν•‘ν•΄μ„œ λ³€ν˜•ν•˜λ˜, μ˜΅μ…”λ„ μš”μ†Œλ“€μ€ μ œκ±°ν•˜κ³ , μƒˆλ‘œμš΄ 배열을 λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ 
(mapν•¨μˆ˜μ˜ κΈ°λŠ₯ + μ˜΅μ…”λ„ 제거 + μ˜΅μ…”널 바인딩 == compactMap)
(λ°°μ—΄μ—μ„œ nil 값을 μ œκ±°ν•  수 있고 μ˜΅μ…”λ„νƒ€μž…μ„ μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€)

 

let numbers = [-2, -1, 0, 1, 2]




var positiveNumbers = numbers.compactMap { $0 >= 0 ? $0 : nil }


print(positiveNumbers)

μ‹€ν–‰ κ²°κ³Ό : [0, 1, 2]

 

6) λ°°μ—΄.flatMap { ν΄λ‘œμ € }

μ€‘μ²©λœ λ°°μ—΄μ˜ 각 배열을 μƒˆλ‘­κ²Œ λ§€ν•‘ν•΄μ„œ λ‚΄λΆ€ μ€‘μ²©λœ 배열을 μ œκ±°ν•œ μƒˆλ‘œμš΄ 배열을 리턴
(쀑첩 배열을 flatν•˜κ²Œ λ§€ν•‘)

 

var nestedArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]


print(nestedArray.flatMap { $0 })
μ‹€ν–‰ κ²°κ³Ό : [1, 2, 3, 4, 5, 6, 7, 8, 9]

'swift λ¬Έλ²•πŸ–€' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[SWIFT] λ©”λͺ¨λ¦¬ 관리  (0) 2023.05.10
[SWIFT] μ˜΅μ…”λ„ 체이닝(Optional Chaining)  (1) 2023.05.10
[SWIFT] μƒμ„±μž  (0) 2023.03.07
[SWIFT] μ΄ˆκΈ°ν™”  (0) 2023.03.04
[SWIFT] 클래슀의 상속  (0) 2023.03.04