[Swift🦩] #30 λͺ¨λ‚˜λ“œ

λ˜μƒΒ·2022λ…„ 6μ›” 4일
0

iOS

λͺ©λ‘ 보기
42/42
post-thumbnail
  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ΄ν•΄ν•˜κΈ° μœ„ν•œ κ°œλ…
  1. μˆ˜ν•™μ μΈ μš©μ–΄ - λ²”μ£Όλ‘ 
  2. μˆœμ„œκ°€ μžˆλŠ” 연산을 μ²˜λ¦¬ν•  λ•Œ ν™œμš©ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄
    μˆ˜ν•™μ μΈ λͺ¨λ‚˜λ“œμ˜ κ°œλ…μ„ 100% λ§Œμ‘±ν•˜λŠ”κ±΄ μ•„λ‹ˆλΌ λͺ¨λ‚˜λ”• 이라고도 뢀름.

ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λͺ¨λ‚˜λ“œκ°€ κ°–μΆ°μ•Όν•˜λŠ” 쑰건

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

-> ν™•μ‹€ν•˜κ²Œ 감은 μ•ˆμ˜€μ§€λ§Œ, Generic, Opaque Types κ°™λ‹€λŠ” λŠλ‚Œμ΄ λ“€μ—ˆλ‹€.


λͺ¨λ‚˜λ“œλ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ κ°œλ…


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

  • 컨텐츠λ₯Ό λ‹΄κ³  μžˆλŠ” μ–΄λ–€ 것.
  • Optional μ—­μ‹œ μ»¨ν…μŠ€νŠΈ
    • .some(let value) μƒνƒœλΌλ©΄, value λ₯Ό λ‹΄κ³  μžˆλŠ” μ»¨ν…μŠ€νŠΈκ°€ λ˜λŠ”κ±°κ³ ,
    • .none μƒνƒœλΌλ©΄, 내뢀에 값이 μ—†λŠ” μ»¨ν…μŠ€νŠΈκ°€ λ˜λŠ” 것.
    • Wrapped νƒ€μž…μ„ 인자둜 λ°›λŠ” Generic νƒ€μž… -> 첫번째 쑰건 만쑱.
    • Int, String, Double λ“± λ‹€λ₯Έ νƒ€μž…μ„ κ°–λŠ” μ»¨ν…μŠ€νŠΈλ₯Ό 생성(λ°˜ν™˜)ν•  수 있음 -> λ‘λ²ˆμ§Έ 쑰건 만쑱.

2. ν•¨μˆ˜ 객체

  • ν•¨μˆ˜ 객체 : 맡을 μ μš©ν•  수 μžˆλŠ” μ»¨ν…Œμ΄λ„ˆ νƒ€μž…
  • μ˜΅μ…”λ„ μ—­μ‹œ ν•¨μˆ˜ 객체이닀.
Optional(2).map { $0 + 2 } // κ°€λŠ₯!!! 
  • Optional 인데 κ°€λŠ₯ν•œ μ΄μœ λŠ”,
  • map μ΄λΌλŠ”κ²Œ κΈ°μ‘΄ μ»¨ν…Œμ΄λ„ˆ μ•ˆμ˜ 값을 κΉŒμ„œ ν•¨μˆ˜λ₯Ό μ μš©ν•˜κ³  λ‹€μ‹œ μ»¨ν…Œμ΄λ„ˆμ— 포μž₯ν•΄μ„œ λ°˜ν™˜ν•΄μ£ΌλŠ” 것이기 λ•Œλ¬Έ.
    • μ»¨ν…Œμ΄λ„ˆλŠ” λ‹€λ₯Έ νƒ€μž…μ˜ 값을 λ‹΄κΈ° λ•Œλ¬Έμ— μ»¨ν…μŠ€νŠΈλΌκ³  λ³Ό 수 μžˆλ‹€.
  • Optinal 을 κΉŒμ„œ 값이 있으면 2λ₯Ό λ”ν•˜κ³ ,
  • 값이 μ—†μœΌλ©΄ 연산을 ν•˜μ§€ μ•Šκ³  빈 μ»¨ν…μŠ€νŠΈλ‘œ λ‹€μ‹œ λ°˜ν™˜.

3. λͺ¨λ‚˜λ“œ

  • λͺ¨λ‚˜λ“œ : λ‹«νžŒ ν•¨μˆ˜ 객체
  • λ‹«νžŒ ν•¨μˆ˜ 객체 : ν•¨μˆ˜κ°μ²΄ μ€‘μ—μ„œ, μžμ‹ μ˜ μ»¨ν…μŠ€νŠΈμ™€ 같은 μ»¨ν…μŠ€νŠΈμ˜ ν˜•νƒœλ‘œ 맡핑할 수 μžˆλŠ” ν•¨μˆ˜ 객체. (Optional 을 Optional 둜 맡핑할 수 μžˆλŠ”!) -> 이것을 μœ„ν•΄ flatMap 을 ν™œμš©.
Optional(3).flatMap {
    if $0.isMultiple(of: 2) {
        return num * 2
    }
    return nil
}
  • 근데 map μ΄λž‘ 뭔차이여...?
  • μ»¨ν…μŠ€νŠΈ λ‚΄λΆ€μ˜ μ»¨ν…μŠ€νŠΈλ₯Ό λͺ¨λ‘ 같은 μœ„μƒμœΌλ‘œ ν‰ν‰ν•˜κ²Œ νŽΌμΉœλ‹€
    • 포μž₯된 κ°’ 내뢀에 또 포μž₯된 값이 μžˆλ‹€λ©΄ κ·Έκ±Έ 같은 μœ„μƒμœΌλ‘œ νŽΌμ³μ€€λ‹€
  • Sequence<Optional<?>> 이라면, compactMap 을 μ‚¬μš©ν•΄μ„œ 펼치고, 이 κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄ flatMap 으둜 νŽΌμΉœλ‹€.
let optionals: [Int?] = [1, 2, nil, 5]

let mapped: [Int?] = optionals.map { $0 } // [1, 2, nil, 5]
let compactMapped: [Int] = optionals.compactMap { $0 } // [1, 2, 5]
// Array λΌλŠ” μ»¨ν…μŠ€νŠΈ μ•ˆμ— Optional μ΄λΌλŠ” μ»¨ν…μŠ€νŠΈκ°€ 듀어감. 
// κ°€μž₯ λ°”κΉ₯ μͺ½ Array 만 μœ μ§€ν•˜κ³  μ•ˆμ˜ Optional μ΄λΌλŠ” μ»¨ν…μŠ€νŠΈλŠ” νŽΌμ³λ²„λ¦Ό.


let multipleContainer = [[1, 2, nil], [3, nil], [4, 5, nil]]

multipleContainer.map { $0.map { $0 } } 
// [[Optinal(1), Optional(2), nil], [Optional(3), nil], [Optional(4), Optional(5), nil]]
multipleContainer.flatMap { $0.flatMap { $0 } } // [1, 2, 3, 4, 5]
func map<U>(_ transform: (Wrapped) throws -> U) rethrows U? 
// λƒ…λ‹€ U λ₯Ό λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— μ€‘μ²©ν•˜λ©΄ μ»¨ν…Œμ΄λ„ˆκ°€ 계속 λ§μ”Œμ›Œμ§.
func flatMap<U>(_ transform: (Wrapped) throws -> U?) rethrows U?
// ν•˜μ§€λ§Œ flatMap 은 Int? κ°€ λ°˜ν™˜ νƒ€μž…μ΄λ©΄ U? == Int? U == Int κ°€ λ˜μ–΄μ„œ μ•Œμ•„μ„œ μ»¨ν…Œμ΄λ„ˆλ₯Ό κΉŒλ²„λ¦Ό.

κ·Έλž˜μ„œ flatMap 의 경우,

  • 값이 μžˆλ‹€λ©΄ κ·Έ 값을 κ°€μž₯ λ°”κΉ₯μͺ½ μ»¨ν…Œμ΄λ„ˆλ§Œ μ”Œμ›Œμ„œ λ°˜ν™˜
  • 값이 μ—†λ‹€λ©΄ κ·Έ λ’€λΆ€ν„°λŠ” μ‹€ν–‰λ˜μ§€ μ•Šκ³  빈 μ»¨ν…Œμ΄λ„ˆλ₯Ό λ°˜ν™˜

ν•˜κΈ° λ•Œλ¬Έμ—, Optional Binding κ³Ό λ˜‘κ°™μ€ λ™μž‘μ„ ν•˜κ²Œ λœλ‹€.
why? Optional 이 Monad λ‹ˆκΉŒ
-> ν”Œλž«λ§΅ λͺ¨μ–‘μ˜ λͺ¨λ‚˜λ“œ μ—°μ‚°μžλ₯Ό κ΅¬ν˜„ν•˜λ©΄ μ‚¬μš©μž μ •μ˜ νƒ€μž…λ„ λͺ¨λ‚˜λ“œλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.



좜처 / 참고

μ•Όκ³°μ˜ μŠ€μœ„ν”„νŠΈ5 ν”„λ‘œκ·Έλž˜λ°

profile
0λ…„μ°¨ iOS κ°œλ°œμžμž…λ‹ˆλ‹€.

0개의 λŒ“κΈ€