woozzang 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