Deep_Dev
article thumbnail

 

λͺ¨λ‚˜λ“œ

λͺ¨λ‚˜λ“œλŠ” νŠΉμ • κΈ°λŠ₯이 μ•„λ‹Œ λ””μžμΈ νŒ¨ν„΄ ν˜Ήμ€ 자료ꡬ쑰라고 ν•  수 μžˆλ‹€.

 

< λͺ¨λ‚˜λ“œκ°€ κ°–μΆ°μ•Ό ν•˜λŠ” 쑰건 >

  • νƒ€μž…μ„ 인자둜 λ°›λŠ” νƒ€μž… ( νŠΉμ • νƒ€μž…μ˜ 값을 포μž₯ )
  • νŠΉμ • νƒ€μž…μ˜ 값을 포μž₯ν•œ 것을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜(λ©”μ„œλ“œ)κ°€ 쑴재
  • 포μž₯된 값을 λ³€ν™˜ν•˜μ—¬ 같은 ν˜•νƒœλ‘œ 포μž₯ν•˜λŠ” ν•¨μˆ˜(λ©”μ„œλ“œ)κ°€ 쑴재

 

μ»¨ν…μŠ€νŠΈ

  • μ»¨ν…μŠ€νŠΈcontextλŠ” 컨텐츠λ₯Ό 담은 μƒμž 같은 것
  • ν•¨μˆ˜μ˜ μ „λ‹¬μΈμžλ‘œ μ»¨ν…μŠ€νŠΈκ°€ λ‹€λ₯Έ 값을 μ „λ‹¬ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
func addThree(_ num: Int) -> Int {
    return num + 3
}
//λ§€κ°œλ³€μˆ˜λ‘œ 일반 Int νƒ€μž…μ˜ 값을 λ°›κΈ° λ•Œλ¬Έμ— μ •μƒμ μœΌλ‘œ μ‹€ν–‰
addThree(2)
//μ „λ‹¬μΈμžκ°€ μˆœμˆ˜ν•œ 값이 μ•„λ‹Œ μ˜΅μ…”λ„μ΄λΌλŠ” μ»¨ν…μŠ€νŠΈλ‘œ λ‘˜λŸ¬μ‹Έμ—¬ μ „λ‹¬λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 였λ₯˜ λ°œμƒ
addThree(Optional(2))

 

ν•¨μˆ˜κ°μ²΄

  • ν•¨μˆ˜κ°μ²΄functorλž€ 맡map을 μ μš©ν•  수 μžˆλŠ” μ»¨ν…Œμ΄λ„ˆ νƒ€μž…μ΄λ‹€.
  • Array, Dictionary, Set λ“±λ“± μŠ€μœ„ν”„νŠΈμ˜ λ§Žμ€ μ»¬λ ‰μ…˜ νƒ€μž…μ΄ ν•¨μˆ˜κ°μ²΄μ΄λ‹€.

 

ν”Œλž«λ§΅ flatMapκ³Ό 컴팩트맡 compactMap

  • ν•¨μˆ˜κ°μ²΄ μ€‘μ—μ„œ μžμ‹ μ˜ μ»¨ν…μŠ€νŠΈμ™€ 같은 μ»¨ν…μŠ€νŠΈμ˜ ν˜•νƒœλ‘œ 맡핑할 수 μžˆλŠ” ν•¨μˆ˜κ°μ²΄λ₯Ό λ‹«νžŒ ν•¨μˆ˜κ°μ²΄λΌκ³  ν•˜λ©°, λͺ¨λ‚˜λ“œλŠ” λ‹«νžŒ ν•¨μˆ˜κ°μ²΄μ΄λ‹€.
  • 이런 맡핑을 μˆ˜ν–‰ν•˜λ„λ‘ ν”Œλž«λ§΅flatMapμ΄λΌλŠ” λ©”μ„œλ“œλ₯Ό ν™œμš©ν•œλ‹€.
  • ν”Œλž«λ§΅ flatMap μ€ 맡 map κ³Ό λ‹€λ₯΄κ²Œ μ»¨ν…μŠ€νŠΈ λ‚΄λΆ€μ˜ μ»¨ν…μŠ€νŠΈλ₯Ό λͺ¨λ‘ 같은 μœ„μƒμœΌλ‘œ ν‰ν‰ν•˜κ²Œ νŽΌμ³μ€€λ‹€.
func doubleEven(_ num: Int) -> Int? {
    if num.isMultiple(of: 2) {
        return num * 2
    }
    return nil
}

Optional(3).flatMap(doubleEven)
//nil
  • compactMap은 μŠ€μœ„ν”„νŠΈ 4.1 버전뢀터 flatMap이 ν•˜λ˜ μ—­ν•  쀑 ν•˜λ‚˜λ₯Ό 맑게 λ˜μ—ˆλ‹€.
  • compactMap의 μ‚¬μš©λ²•μ€ flatMapκ³Ό κ°™μ§€λ§Œ μ’€ 더 λΆ„λͺ…ν•œ λœ»μ„ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ compactMapμ΄λΌλŠ” 이름을 μ‚¬μš©ν•œλ‹€.

 

let optionals: [Int?] = [1, 2, nil, 5]

let mapped: [Int?] = optionals.map{ $0 }
let compactMapped: [Int] = optionals.compactMap{ $0 }

print(mapped)    //[Optional(1), Optional(2), nil, Optional(5)]
print(compactMapped)    //[1, 2, 5]
  • λ§Œμ•½ ν”Œλž«λ§΅ flatMap μ„ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ ν”Œλž«λ§΅ flatMap κ³Ό 같은 효과λ₯Ό μ–»μœΌλ €λ©΄ 바인딩을 직접 ν•΄μ£Όλ©΄ λœλ‹€.

 

func stringToInteger(_ string: String) -> Int? {
    return Int(string)
}

func integerToString(_ integer: Int) -> String? {
    return "\(integer)"
}

var optionalString: String? = "2"
var result: Int?

if let string: String = optionalString {
    if let number: Int = stringToInteger(string) {
        if let finalString: String = integerToString(number) {
            if let finalNumber: Int = stringToInteger(finalString) {
                result = Optional(finalNumber)
            }
        }
    }
}

print(result)    //Optional(2)
  • ν”Œλž«λ§΅ flatMap μ€ 체이닝 쀑간에, 연산에 μ‹€νŒ¨ν•˜λŠ” κ²½μš°λ‚˜ 값이 μ—†μ–΄μ§€λŠ” κ²½μš°μ—λŠ” λ³„λ„μ˜ μ˜ˆμ™Έ μ²˜λ¦¬μ—†μ΄ 빈 μ»¨ν…Œμ΄λ„ˆλ₯Ό λ°˜ν™˜ν•œλ‹€.

 

func integerToNil(param: Int) -> String? {
    return nil
}

optionalString = "2"

result = optionalString.flatMap(stringToInteger).flatMap(integerToNil).flatMap(stringToInteger)

print(result)    //nil