๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Programming ๊ฐœ๋ฐœ/๐ŸŽ iOS ๊ฐœ๋ฐœ, Swift

[WWDC 2022] Embrace Swift Generics

by kimdee 2023. 2. 14.
๋ฐ˜์‘ํ˜•
๐Ÿ’ก ์šฉ์–ด ์ •๋ฆฌ
concrete type ๊ตฌ์ฒดํƒ€์ž…
opaque type ๋ถˆํˆฌ๋ช…ํƒ€์ž…
underlying type ๊ธฐ๋ฐ˜ํƒ€์ž…
existential type ์‹ค์กดํƒ€์ž…
type erasure ํƒ€์ž… ์ด๋ ˆ์ด์„œ
boilerplate code ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ

 

 


Swift 5.7์—์„œ์˜ ์ œ๋„ค๋ฆญ

์ œ๋„ค๋ฆญ์€ Swift์—์„œ ์ถ”์ƒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ํˆด. ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ ๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ๋งค์šฐ ์ค‘์š”.

<T> where T: Idea 
  • ์ œ๋„ค๋ฆญ์€ ํŠน์ • ํƒ€์ž…์˜ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ถ”์ƒํ™”ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  • ์ค‘๋ณต๋˜๋Š” ๊ตฌํ˜„์ด ์žˆ๋Š” ์˜ค๋ฒ„๋กœ๋“œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ผ๋ฐ˜ํ™”ํ•ด์•ผํ•  ๋•Œ
  • ๊ตฌ์ฒด ํƒ€์ž…์œผ๋กœ ์‹œ์ž‘ํ•ด์„œ ํ•„์š”ํ•  ๋•Œ ์ผ๋ฐ˜ํ™” ํ•˜๊ธฐ

๋‹คํ˜•์„ฑ Polymorphism

๋‹คํ˜•์„ฑ์€ ๋‹ค๋ฅธ ๊ตฌ์ฒด ํƒ€์ž…์—์„œ ํ•˜๋‚˜์˜ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ถ”์ƒํ™”ํ•˜๋Š” ๊ฒƒ

image by codegym

๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ์• ๋“œํ˜น ๋‹คํ˜•์„ฑ ad-hoc polymorphism
    • ์ธ์ž ํƒ€์ž…(&๊ฐฏ์ˆ˜)์— ๋”ฐ๋ผ ๊ฐ™์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด์–ด๋„ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ
    • ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ
    • ์ด๊ฒŒ ์ผ๋ฐ˜์ ์ธ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹˜. ์ƒˆ๋กœ์šด ํƒ€์ž…์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์ถ”๊ฐ€์ ์ธ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ํ•„์š”. ๊ฒฐ๊ตญ repetitive implementation ์ด ๋จ.
  • ์„œ๋ธŒํƒ€์ž… ๋‹คํ˜•์„ฑ subtype polymorphism
    • ์ˆ˜ํผํƒ€์ž… ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋Ÿฐํƒ€์ž„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ์„œ๋ธŒํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Œ.
    • ์ฆ‰, ์„œ๋ธŒํด๋ž˜์‹ฑ. ํด๋ž˜์Šค๊ฐ€ ์ˆ˜ํผํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ override
  • ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‹คํ˜•์„ฑ parametric polymorphism - ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉ
    • ์ œ๋„ค๋ฆญ ์ฝ”๋“œ๋Š” ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ํƒ€์ž…๋“ค๊ณผ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ ๊ตฌ์ฒดํƒ€์ž… ์ž์ฒด๊ฐ€ ์ธ์ž๋กœ์„œ ์‚ฌ์šฉ๋จ.

ํ”„๋กœํ† ์ฝœ protocol

  • ๊ธฐ๋Šฅ์„ ํ‘œํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
  • ๊ตฌํ˜„๋˜๋Š” ์„ธ๋ถ€์‚ฌํ•ญ์—์„œ ์•„์ด๋””์–ด๋ฅผ ๋ถ„๋ฆฌํ•œ ๊ฒƒ
  • ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…์˜ ๊ธฐ๋Šฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ถ”์ƒํ™” ๋„๊ตฌ
  • ๊ฐ ๊ธฐ๋Šฅ์€ ํ”„๋กœํ† ์ฝœ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋‚˜ํƒ€๋ƒ„

์—ฐ๊ด€ํƒ€์ž… associatedtype

  • ๊ตฌ์ฒดํƒ€์ž…์˜ ํ”Œ๋ ˆ์ด์Šคํ™€๋”
  • ์—ฐ๊ด€ํƒ€์ž…์€ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ํŠน์ •ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง

๋ถˆํˆฌ๋ช… ํƒ€์ž…opaque type vs. ๊ธฐ๋ฐ˜ ํƒ€์ž…underlying type

๋ถˆํˆฌ๋ช…ํƒ€์ž…

  • some Tea
  • <T: Tea>
  • ์ถ”์ƒํƒ€์ž…์œผ๋กœ ํŠน์ • ๊ตฌ์ฒด ํƒ€์ž…์˜ ํ”Œ๋ ˆ์ด์Šคํ™€๋”๋ฅผ ๋‚˜ํƒ€๋ƒ„
  • ์ธํ’‹๊ณผ ์•„์›ƒ์— ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

๊ธฐ๋ฐ˜ํƒ€์ž…

  • ํŠน์ • ๊ตฌ์ฒด ํƒ€์ž…์œผ๋กœ ๋ถˆํˆฌ๋ช…ํƒ€์ž…์œผ๋กœ ๋Œ€์ฒด๋จ
  • ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ์ œ๋„ค๋ฆญ ์ฝ”๋“œ๋Š” ๊ฐ’์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ๊ธฐ๋ฐ˜ ํƒ€์ž…์„ ๋ฐ›๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋จ.

์ œ๋„ค๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ ํŒ (protocols or not)

some

~ Swift 5.6 (AS - IS)

func feed<A>(_ cat: C) where C: Cat

// ๋˜๋Š” func feed<C: Cat>(_ cat: C)

Swift 5.7 ~ (TO - BE)

func feed(_ cat: some Cat)
  • ํฌ๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ์ถ”์ƒํƒ€์ž… Cat์„ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.  some Cat
  • ์œ„์— ์žˆ๋Š” ์ •์˜๋“ค์€ ๋ชจ๋‘ ์ƒ๋™ํ•˜์ง€๋งŒ, 5.7 ์ดํ›„์˜ ์ƒˆ ๋ฒ„์ „์ด ์ข€ ๋” ๊ฐ€๋…์„ฑ๊ณผ ์ด๋…์„ฑ์ด ์ข‹๋‹ค.
  • some ํ‚ค์›Œ๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜, result ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 5.6 ์ด์ „์—๋Š” ํ”„๋กœํผํ‹ฐ ํƒ€์ž…๊ณผ ๋ฆฌํ„ด ํƒ€์ž…์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • some ์€ ๊ธฐ๋ฐ˜ํƒ€์ž…์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ.

any

 

any๋Š” Swift 5.7 ์ด์ƒ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํ”„๋กœํ† ์ฝœ ํƒ€์ž… ๋ฐฐ์—ด๊ณผ ๊ฐ™์ด ํ”„๋กœํ† ์ฝœ์˜ ์ž„์˜ ํƒ€์ž…์„ ํ‘œํ˜„ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ,  any ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • any ๋Š” ๋Ÿฐํƒ€์ž…์—์„œ ๊ธฐ๋ฐ˜ ํƒ€์ž…์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ.
  • any X ๋Š” ๋‹จ์ผ ์Šคํƒœํ‹ฑ ํƒ€์ž…์œผ๋กœ X ๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ๊ตฌ์ฒดํƒ€์ž…์„ ๋™์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐ’ ํƒ€์ž…๊ณผ ํ•จ๊ป˜ ์„œ๋ธŒํƒ€์ž… ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • any ์— ํ•„์š”ํ•œ ์œ ์—ฐํ•œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ  any X ํƒ€์ž…์€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ํŠน๋ณ„ํ•œ ํ‘œํ˜„๋ฐฉ์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.
    • ์ด ํ‘œํ˜„๋ฐฉ์‹์„ ๊ณ ์ •๋œ ์ƒ์ž๋กœ ์ƒ๊ฐํ–ˆ์„๋•Œ,
       
      • ๊ตฌ์ฒด ํƒ€์ž…์€ ์ƒ์ž ์•ˆ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ƒ์ž ์•ˆ์— ์ €์žฅ์ด ๋œ๋‹ค.
      • ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šค์˜ ํฌ์ธํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ๊ตฌ์ฒดํƒ€์ž…  X ๋ฅผ ๋™์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ์Šคํƒœํ‹ฑ ํƒ€์ž… any X ๋Š” ์‹ค์กดํƒ€์ž…์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • ๋‹ค๋ฅธ ์ฝ˜ํฌ๋ฆฌํŠธ ํƒ€์ž…์„ ๋™์ผํ•œ ํ‘œํ˜„๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์„ ํƒ€์ž… ์ด๋ ˆ์ด์„œ (type erasure) ๋ผ๊ณ  ํ•œ๋‹ค.
  • ๊ตฌ์ฒดํƒ€์ž…์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ง€์›Œ์ง€๋ฉฐ, ์˜ค์ง ๋Ÿฐํƒ€์ž„์—์„œ๋งŒ ์•Œ ์ˆ˜ ์žˆ์Œ.
  • ํƒ€์ž… ์ด๋ ˆ์ด์„œ๋Š” X ๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค ๊ฐ„์— ํƒ€์ž… ๋ ˆ๋ฒจ ๊ตฌ๋ถ„์„ ์ œ๊ฑฐํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด์„œ ๋‹ค๋ฅธ ๋™์  ํƒ€์ž…์„ ๋™์ผํ•œ ์ •์  ํƒ€์ž…์œผ๋กœ ์ƒํ˜ธ ๊ตํ™˜ํ•˜๋Š” ์‹์œผ๋กœ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ.

some vs. any

  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ธฐ๋ฐ˜ ๊ฐ’์„ ์–ธ๋ฐ•์‹ฑํ•ด์„œ some X ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ฐ”๋กœ ๋„˜๊ฒจ์คŒ์œผ๋กœ์จ any X ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ some X ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Swift 5.7~some any
      ๊ณ ์ •๋œ ๊ตฌ์ฒดํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค ์ž„์˜์˜ ๊ตฌ์ฒดํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
      ํƒ€์ž… ๊ด€๊ณ„๋ฅผ ๋ณด์žฅ ํƒ€์ž… ๊ด€๊ณ„๋ฅผ ์‚ญ์ œ

๐Ÿฆฎ ์š”์•ฝ

  • ๊ธฐ๋ณธ์ ์œผ๋กœ some ์‚ฌ์šฉํ•˜๊ธฐ
  • ์ž„์˜ ๊ฐ’์„ ์ €์žฅํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ any ๋กœ ๋ณ€๊ฒฝ. ์—ฌ๊ธฐ์„œ ์ž„์˜์˜ ๊ฐ’์€ ์ž„์˜์˜ ๊ตฌ์ฒดํƒ€์ž… ์ธ์Šคํ„ด์Šค๋ฅผ ๋œปํ•จ.

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž… ์ด๋ ˆ์ด์„œ์™€ ๋งฅ๋ฝ์  ํ•œ๊ณ„(semantic limitations) ์— ๋“œ๋Š” ๋น„์šฉ์„, ์˜ค์ง ์ €์žฅ๊ณต๊ฐ„์˜ ์œ ์—ฐ์„ฑ์ด ํ•„์š”ํ•  ๋•Œ๋งŒ ์ง€๋ถˆํ•  ์ˆ˜ ์žˆ์Œ. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ let ์„ ์“ฐ๋‹ค๊ฐ€ ๊ฐ’ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๋•Œ var ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ ‘๊ทผ ๋ฐฉ์‹.


๐Ÿฅž ๋ถ€๋ก

ํƒ€์ž… ์ด๋ ˆ์ด์„œ๋ž€

์ œ๋„ค๋ฆญ ์œ ํ˜•์„ ์ง€์›ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ํƒ€์ž… ์ด๋ ˆ์ด์„œ๋Š” ์ž์œ ๋กญ๊ฒŒ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋Š”, ์ œ์•ฝ๋˜์ง€ ์•Š์€ ๋…ผ-์ œ๋„ค๋ฆญ ํƒ€์ž… ์•ˆ์— ์ œ์•ฝ๋œ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์ถ”์ƒํ™”ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค.


๋งŒ์•ฝ ํƒ€์ž…์„ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด์˜ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ๋œ๋‹ค๋ฉด (aka. ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด)

ํƒ€์ž…์„ ์•Œ ์ˆ˜ ์—†๋‹ค๋ฉด ๊ฐ์ฒด๊ฐ€ ๊ณต๊ฐœํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์•Œ ์ˆ˜ โŒ

ํ•˜์ง€๋งŒ, ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…๋“ค์ด ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด ๋‘˜ ๊ฒƒ์„ ์•ฝ์†ํ•ด๋‘”๋‹ค๋ฉด → ํ”„๋กœํ† ์ฝœ

์™œ ํƒ€์ž… ์ •๋ณด๋ฅผ ์ง€์›Œ์•ผํ• ๊นŒ?

์Šค์œ„ํ”„ํŠธ๋Š” ๋ฉ€ํ‹ฐ ํŒจ๋Ÿฌํƒ€์ž„ ์–ธ์–ด๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ฒด์ง€ํ–ฅ/ํ•จ์ˆ˜์ง€ํ–ฅ/์ œ๋„ค๋ฆญ์ง€ํ–ฅ/ํ”„๋กœํ† ์ฝœ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ ๋‚ด์—์„œ ๊ตฌ์กฐ๋ฅผ ์งœ๋„๋กํ•จ. ํ”„๋กœํ† ์ฝœ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฃผ์ถง๋Œ์€, ์ƒ์†๊ณผ ๊ฐ™์ด ๋†’์€ ๊ฒฐํ•ฉ๋„๋ฅผ ์ง€์–‘ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ํŒจํ„ด์„ ๋”ฐ๋ฅด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋  ๊ฒƒ.

์ด ์ปดํŒŒ์ผ๋Ÿฌ ์—๋Ÿฌ๋Š” ์Šค์œ„ํ”„ํŠธ์˜ ํ”„๋กœํ† ์ฝœ ์—ฐ๊ด€ ํƒ€์ž…๊ณผ ์ œ๋„ค๋ฆญ ์ œ์•ฝ์กฐ๊ฑด์„ ๋ชจ๋‘ ์ฐธ์กฐํ•œ๋‹ค. ์ด ์—๋Ÿฌ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์ตœ์ข…์ ์œผ๋กœ๋Š” ํƒ€์ž… ์ด๋ ˆ์ด์„œ ํŒจํ„ด์„ ์ ์šฉํ•  ๊ฒƒ.

์ด ์—๋Ÿฌ๋Š” ์—ฐ๊ด€๊ฐ’์ด ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ์„ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฐœ์ฒด์˜ ์ฝœ๋ ‰์…˜์œผ๋กœ์„œ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒ.

protocol Cat {
  associatedtype CatType
  var power: String { get }
  func eat() -> Int
  func weight(of cat: CatType) -> Double
}

var cats: [Cat] = [cat1, cat2, ... ]
var totalWeight: Int = 0
for c in cats {
  totalWeight += c.weight(of: < ??? >)
}

์—ฐ๊ด€ํƒ€์ž…์„ ๊ฐ€์ง„ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌ์ฒดํƒ€์ž…์œผ๋กœ ํ—ˆ์šฉํ•œ๋‹ค์† ์ณ๋„ ์ด ์—ฐ๊ด€ ํƒ€์ž…์ด ๊ตฌ์ฒด์ ์œผ๋กœ ๊ฒฐ์ •๋˜์–ด์•ผ ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ฒŒ ๋จ. ์Šค์œ„ํ”„ํŠธ๋Š” type-safeํ•œ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ”„๋กœํ† ์ฝœ์˜ ๊ธฐ๋ฐ˜ํƒ€์ž…์„ ์•Œ๊ณ  ์žˆ์–ด๋„ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋™์ž‘ํ•˜์ง€ ์•Š์Œ.

Swift 5.6 ์ด์ „์—์„œ๋Š”

5.6 ์ด์ „์—์„œ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด ๊ฐœ์ฒด๋“ค์„ ์ œ์•ฝ์—†๊ณ  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ “Any” ๋ฐ”๋ฆฌ์—์ด์…˜ ์•ˆ์— ๋„ฃ์–ด๋‘ .

class CatSequence {
    let value: Any

    init<T: Sequence>(_ sequence: T) {
        self.value = sequence
    }
}

์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ‘ํƒ€์ž… ์ด๋ ˆ์ด์„œ’๋ผ๊ณ  ํ•œ๋‹ค.

์Šค์œ„ํ”„ํŠธ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ์— ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋“ค์ด ๋งŽ์ด ํฌํ•จ์ด ๋˜์–ด ์žˆ๋‹ค. ํƒ€์ž… ์ด๋ ˆ์ด์„œ๋ฅผ ์ด์šฉํ•ด ์˜์กด์„ฑ ์ฃผ์ž…๋„ ์ด๋ฃจ์–ด์ง. (์ฐธ๊ณ ๋กœ ์ด๋Š” Swift 5.6 ์ด์ „์˜ ์ด์•ผ๊ธฐ)

Swift 5.7 ์ดํ›„์—์„œ๋Š”

any ์‹ค์กด ํƒ€์ž…์˜ ์ถ”๊ฐ€๋กœ ํƒ€์ž… ์ด๋ ˆ์ด์„œ๊ฐ€ Swift ์ปดํŒŒ์ผ๋Ÿฌ์˜ feature๊ฐ€ ๋จ. ์ด์ œ ํƒ€์ž… ์•ž์— any ๋ฅผ ๋ถ™์ž„์œผ๋กœ์จ ์ž๋™์œผ๋กœ ์Šค์œ„ํ”„ํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ์ถ”์ƒํ™”ํ•จ. ํƒ€์ž…์ด ์ง€์›Œ์ง„ ๊ฐ’ ⇒ ์ด๊ฒƒ์„ ์‹ค์กด ํƒ€์ž…์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋กœ ํ•จ.

let erased: any Cat = KoreanShortHairCatType()

์ด์ œ ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋Œ€์‹ ์—, ์ œ์•ฝ์กฐ๊ฑด ์—†์ด ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์‹ค์กดํƒ€์ž…์œผ๋กœ ์ฐธ์กฐํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ๊ฒŒ ๋  ๊ฒƒ.

any ํƒ€์ž…์˜ ํƒ€์ž… ์•ˆ์ „์„ฑ

์ˆ˜๋™์ ์ธ ํƒ€์ž… ์ด๋ ˆ์ด์„œ์™€ ๋‹ฌ๋ฆฌ ์•ˆ์ „ํ•˜๋‹ค. Any ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ํƒ€์ž… ์ด๋ ˆ์ด์„œ๋Š” ๊ฒฐ๊ตญ ๊ฐ’์„ ์–ธ๋ž˜ํ•‘ ํ•ด์•ผ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Œ

 

๐Ÿ”— ์ฐธ๊ณ ๋งํฌ

https://developer.apple.com/wwdc22/110352

https://www.swiftbysundell.com/articles/referencing-generic-protocols-with-some-and-any-keywords/

https://academy.realm.io/posts/tryswift-gwendolyn-weston-type-erasure/

https://soooprmx.com/ํƒ€์ž…-์ง€์šฐ๊ธฐ-type-erasure-swift/

https://docs.swift.org/swift-book/LanguageGuide/OpaqueTypes.html

https://swiftrocks.com/whats-any-understanding-type-erasure-in-swift

 


 

 

 

์˜ค๋Š˜๋„ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. 

 

๊ถ๊ธˆํ•˜๊ฑฐ๋‚˜ ๋‚˜๋ˆ„๊ณ  ์‹ถ์€ ์–˜๊ธฐ๊ฐ€ ์žˆ์œผ์‹œ๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”!

์žฌ๋ฐŒ๊ฒŒ ์ฝ์œผ์…จ๋‹ค๋ฉด ๊ณต๊ฐ๊ณผ ๊ตฌ๋…์€ ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค. 

 

ํ•ญ์ƒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

์ด ๊ธ€์€ doy.oopy.io ์—๋„ ๋ฐœํ–‰๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 

 

 

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€