[WWDC 20] Embrace Swift Type Inference
μλ νμΈμ π₯·π»
μ΄λ² μκ°μλ WWDC 20: Embrace Swift Type Inference μμμ μμ½ν΄λ³΄μμ΅λλ€.
κ·ΈλΌ μμν΄λ³Όκ²μ!
μμμ ꡬμ±
- Leveraging type inference
- How type inference works in compiler
- Using Swift and Xcode to fix compiler errors
Leveraging type inference
νμ μΆλ‘ μ μ¬μ©νλ©΄ μ€λ³΅λκ±°λ λ μ€μν μ 보(verbose, incidental) λ₯Ό μ½λμ λ΄μ§ μμ μ μκ² λ©λλ€.
λ°λΌμ μ½λκ° κΉλν΄μ§κ³ , μμ°μ±μ΄ μ¦κ°ν©λλ€.
let text = ""
μμ νμ μΆλ‘ μμλ μμ£Ό κ°λ¨ν©λλ€.
"" λΌλ String literal μ ν΅ν΄ μ»΄νμΌλ¬λ text μμλ₯Ό String μ΄λΌλ νμ μΌλ‘ μΆλ‘ ν©λλ€.
νμ μΆλ‘ μ νΉν SwiftUI μμ μ¬μ¬μ© κ°λ₯ν λ·°λ₯Ό νΈμΆνλ μ§μ (call-site)μμ μ νμ©ν μ μμ΅λλ€.
μμ μμλ μ΄λ€ λ°μ΄ν°μμλ μ¬μ©ν μ μλ μ¬μ¬μ©κ°λ₯ν λ·°λ₯Ό λ§λ€κΈ° μν΄, μ λλ¦μ μ¬μ©ν©λλ€.
μλλ μ λλ¦μ μ¬μ©νμ¬ μ μΈν FilteredList λ·°μ λλ€.
public struct FilteredList<Element, FilterKey, RowContnet> {
public init(_ data: [Element],
filterBy key: KeyPath<Element, FilterKey>,
isIncluded: @escaping (FilterKey) -> Bool,
@ViewBuilder rowContent: @escaping (Element) -> RowContent) { ... }
}
FilteredListλ Element, FilterKey, RowContent λΌλ μΈ κ°μ§μ νμ νλΌλ―Έν°λ₯Ό μ¬μ©ν©λλ€.
μ΄ νμ νλΌλ―Έν°(νΉμ Placeholder)λ€μ νΈμΆ μμ μ μ€μ νμ (concrete type) μΌλ‘ κ΅μ²΄λ κ²μ λλ€.
μ λλ¦μ μ¬μ©ν μ½λλ λ κ°μ§ λ°©μ μ€ νλλ₯Ό μ¬μ©νμ¬ νμ νλΌλ―Έν°λ₯Ό concrete type μΌλ‘ κ΅μ²΄ν©λλ€.
1. μ»΄νμΌλ¬μ νμ μΆλ‘ μ μμ‘΄νλ€.
2. μ§μ νΈμΆ μ§μ (call-site) μμ νμ μ λͺ μνλ€.
μλλ FilterList λ·°μ μμ±μλ₯Ό νΈμΆνλ μ§μ (call-site) μ λλ€.
FilteredList (
smoothies,
filteredBy: \.title,
isIncluded: { title in title.hasSubstring(searchPrases) }
) { smoothie in
SmoothieRowView(smoothie: smoothie)
}
νμ μΆλ‘ μ μμ§νκ³ μκΈ° λλ¬Έμ, μ½λκ° κΉλν©λλ€.
Notice how clean the call-site is. (μ€μ λ‘ νλ§)
λ§μ½ νμ μΆλ‘ μ νμ§ μκ³ , μ§μ νμ μ λͺ μνλ©° νΈμΆνλ©΄ μ΄λ»κ² λ κΉμ?
μλ μ½λμμλ μ§μ νμ μ λͺ μνμ¬ νΈμΆνκ³ μμ΅λλ€.
κ·Έλ°λ° μ€μ νμ λμ Placeholder λ₯Ό μ μμ΅λλ€. λ μλΆλ€μ΄ μ΄κ²λ€μ΄ μ€μ νμ μ΄λΌκ³ μμν΄μ£ΌμΈμ!
FilteredList<Element, FilterKey, RowContent> (
smoothies as [Element],
filteredBy: \Element.title as KeyPath<Element, FilterKey>,
isIncluded: { (title: KeyPath) -> Bool in title.hasSubstring(searchPrases) }
) { (smoothie: Element) -> RowContent in
SmoothieRowView(smoothie: smoothie)
}
μ½λκ° λΆνμν νμ λͺ μλ‘ λ³΅μ‘ν΄μ Έ μ½κΈ° νλ€μ΄μ‘μμ μ μ μμ΅λλ€.
λν μ½λ μμ±μκ° μλμΌλ‘ νμ μ μ§μ ν΄μ£Όμ΄μΌ νκΈ° λλ¬Έμ μ½λ μμ± μκ°μ΄ μ¦κ°ν κ²μ λλ€.
μ¦, νμ μΆλ‘ μ μ¬μ©νλ©΄ μλμΌλ‘ μΌμΌμ΄ νμ μ μμλ΄μ μ μ νμκ° μκΈ° λλ¬Έμ, μμ€ μ½λλ₯Ό λ λΉ λ₯΄κ² μμ±ν μ μκ² λ©λλ€.
How type inference works in compiler
νμ μΆλ‘ μ νμ μΆλ‘ μκ³ λ¦¬μ¦μ μν΄ λμν©λλ€.
νμ μΆλ‘ μ κ°λ¨νκ² νΌμ¦ λ§μΆκΈ°λΌκ³ μκ°ν μ μμ΅λλ€.
μ»΄νμΌλ¬λ μμ€μ½λμμ λ¨μλ₯Ό μ°Ύμμ, Placeholder λ€μ concrete type μΌλ‘ μ±μλκ°λλ€.
νΌμ¦μ νΉμ±κ³Ό κ°μ΄, νλμ Placehoder λ₯Ό μ±μ λ€λ©΄ λλ¨Έμ§μ λν λ λ§μ λ¨μλ€μ΄ μ겨λ©λλ€.
λ§μ½ μΆλ‘ λ νμ μΌλ‘ μ»΄νμΌν μ μμ λ, μ»΄νμΌλ¬λ λ ΈνΈμ ν¨κ» μλ¬ λ©μμ§λ₯Ό μ λ¬ν©λλ€.
μμΈν λ΄μ©μ λ Έμ μ μμ±ν κΈ°λ‘ μ μ°Έκ³ ν΄μ£ΌμΈμ!
Using Swift and Xcode to fix compiler errors
Xcode 12 μμ νμ μΆλ‘ μ λ°μνλ μλ¬ μΆμ κΈ°λ₯μ΄ ν΅ν©λμκΈ° λλ¬Έμ,
μ΄μ μ»΄νμΌλ¬ μλ¬κ° λ°μν λ μΆκ°μ μΈ μ»΄νμΌλ¬ λ ΈνΈλ₯Ό μ 곡λ°μ μ μκ² λ©λλ€.
μ°μ λ°μν μ΄μλ₯Ό μ’ λ κ°νΈνκ² λ³΄κΈ° μν΄, Build fail μ μ΄μ λ΄λΉκ²μ΄ν°λ₯Ό λμ°λ μ€μ μ ν΄μ€λλ€.
Xcode → Behaviors → Falis νμ Show issue Navigator λ‘ μ€μ
μ΄μ μ»΄νμΌλ¬ λ ΈνΈλ νμ μΆλ‘ μ΄ μ€ν¨νμμ κ²½μ°μλ 보μ΄κ² λλ©°, μ΄ λ ΈνΈλ₯Ό ν΄λ¦ μ μλ¬κ° λ°μν μμ€μ½λλ‘ μ΄λμμΌμ€λλ€. μμ°μ±μ μ¦λλ₯Ό μ½κ°(?) κΈ°λν μ μμ΅λλ€.
μ’μ κΈ°λ₯ μμΌλ©΄ μ΄κ²μ κ² λ€ μ μ©ν΄λ΄μΌκ² μ£ ?
μ€λλ λλ μ±μ₯νλ€!!π₯
π€ [Back to the Basics] π»
μ£Όλμ΄ iOS κ°λ°μ μ°μ§±μ κΈ°μ λΈλ‘κ·Έμ λλ€.
[μ°Έκ³ μλ£ ππ»βοΈ]
https://developer.apple.com/videos/play/wwdc2020/10165/
https://marsh-flavor-e1c.notion.site/Embracing-Swift-type-inference-bd6ac8fd46cb48a7afc2a35235541085