ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [WWDC 20] Embrace Swift Type Inference
    iOS/πŸ‘¨πŸ»‍πŸ’» WWDC 와 ν…Œν¬μ„Έλ―Έλ‚˜ 2022. 5. 23. 01:01

     

    μ•ˆλ…•ν•˜μ„Έμš” πŸ₯·πŸ»

    이번 μ‹œκ°„μ—λŠ” 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

    'iOS > πŸ‘¨πŸ»β€πŸ’» WWDC 와 ν…Œν¬μ„Έλ―Έλ‚˜' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

    [WWDC 21] ARC in Swift: Basics and beyond  (0) 2022.05.15

    λŒ“κΈ€

μ–΄μ œλ³΄λ‹€ λ°œμ „ν•œ λ‚˜