longlivedrgn
Miro ์ฐพ๊ธฐ
longlivedrgn
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (74)
    • Swift (36)
    • iOS (31)
    • Algorithm (0)
    • Architecture, Design Patter.. (1)
    • Computer Science (6)
      • ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ (6)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
longlivedrgn

Miro ์ฐพ๊ธฐ

[Swift] Generic
Swift

[Swift] Generic

2023. 2. 3. 21:43

๐Ÿ’ฅ Generic(์ œ๋„ค๋ฆญ)

  • ํƒ€์ž…์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๋ฒ”์šฉ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

๐ŸŒŸ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜

  • ๋งŒ์•ฝ ๋‚ด๊ฐ€ ์ธ์ž๋กœ ๋“ค์–ด์˜ค๋Š” int๊ฐ’์„ ์„œ๋กœ swapํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•จ์ˆ˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์žˆ๋‹ค.
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
   let tempA = a
   a = b
   b = tempA
}
  • ๊ทธ๋ฆฌ๊ณ , ๋งŒ์•ฝ ๋‚ด๊ฐ€ String๊ฐ’์„ ์„œ๋กœ swapํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •์„ ํ•œ๋‹ค๋ฉด?
func swapTwoStrings(_ a: inout String, _ b: inout String) {
   let tempA = a
   a = b
   b = tempA
}
  • ์ฆ‰, ์œ„์™€ ๊ฐ™์ด type ๋ณ„๋กœ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ๋œ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜, ์•„๋ž˜์™€ ๊ฐ™์ด ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž…์— ์ƒ๊ด€์—†์ด ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • T ⇒ Type Parameter๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
   let tempA = a
   a = b
   b = tempA
}

๐ŸŒŸ ์ œ๋„ค๋ฆญ ํƒ€์ž…

  • ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž…์„ ์ƒ์„ฑํ•ด ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์ œ๋„ค๋ฆญ์„ ํ™œ์šฉํ•˜์—ฌ stack์„ ๋งŒ๋“ค์–ด๋ณด์ž.
struct Stack<T> {
    let data: [T] = []
    mutating func push(_ data: T) {
    ... }
    mutating func pop() -> T {
    ... }
}
  • ๊ทธ๋ฆฌ๊ณ  ์ œ๋„ค๋ฆญ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” <>์„ ํ†ตํ•˜์—ฌ ํƒ€์ž…์„ ๋ช…์‹œํ•ด์ฃผ์–ด์•ผ๋œ๋‹ค.
let intStack: Stack<Int> = .init()
 or
let intStack = Stack<Int>.init()
  • ๊ทธ๋Ÿฐ๋ฐ, ์œ„์™€ ๊ฐ™์€ ํ˜•์‹์€ ์šฐ๋ฆฌ๊ฐ€ ํ‰์†Œ์— array๋ฅผ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋˜‘๊ฐ™๋‹ค.
  • ์™œ๋ƒํ•˜๋ฉด, array๋„ generic์ด๊ฑฐ๋“ !
let intArray: Array<Int> = .init()
 or
let intArray = Array<Int>.init()

๐ŸŒŸ ํƒ€์ž… ์ œ์•ฝ์ฃผ๊ธฐ

  • ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜ ๋ฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ์— ํŠน์ •ํ•œ ํด๋ž˜์Šค๋งŒ ํ˜น์€ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ์ œ์•ฝ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿซง ํ”„๋กœํ† ์ฝœ ์ œ์•ฝ

  • Type Parameter ์˜†์— ํ”„๋กœํ† ์ฝœ์„ ์ถ”๊ฐ€ํ•˜์—ฌ, ํ•ด๋‹น ํ”„๋กœํ† ์ฝœ์„ ๋งŒ์กฑํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
func isSameValues<T: Equatable>(_ a: T, _ b: T) -> Bool {
    return a == b
}

๐Ÿซง ํด๋ž˜์Šค ์ œ์•ฝ

  • Type Parameter ์˜†์— ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ, ํ•ด๋‹น ํด๋ž˜์Šค ํ˜น์€ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜๋งŒ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์•„๋ž˜์˜ ์˜ˆ๋Š”, Human class ํ˜น์€ Human class์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋งŒ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
func function<T: Human>(_ a: T) { }

+) ์ œ๋„ค๋ฆญ ํƒ€์ž… ์ œํ•œ ์ฃผ๊ธฐ

  • ์•„๋ž˜์™€ ๊ฐ™์ด ์ œ๋„ค๋ฆญ ํƒ€์ž…์ผ ๊ฒฝ์šฐ, ๋ชจ๋“  ํƒ€์ž…์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ํŠน์ • ํƒ€์ž…(Double)๋งŒ์„ ๋ฐ›๋„๋ก ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?
  • ์•„๋ž˜์™€ ๊ฐ™์ด Element type์€ CalculateItem protocol์„ ์ฑ„ํƒํ•˜๊ฒŒ ํ•ด์ฃผ์ž.
struct CalculatorItemQueue<Element: CalculateItem> {
    
    var elements = [Element]()
}
  • ๊ทธ๋ฆฌ๊ณ , ์›ํ•˜๋Š” ํƒ€์ž…์ด ํ•ด๋‹น ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ฒŒ ํ•œ๋‹ค. ์ฆ‰, Double์€ CalculateItem protocol์„ ๋งŒ์กฑํ•˜๋ฏ€๋กœ, Element์— Double ํƒ€์ž…์ด ๋“ค์–ด๊ฐ€๋„ ๋˜๋Š” ๊ฒƒ์ด๋‹ค!
protocol CalculateItem { }

extension Double: CalculateItem { }

๐Ÿ“š ์ฐธ๊ณ ์ž๋ฃŒ

Swift) ์ œ๋„ค๋ฆญ(Generic) ์ •๋ณตํ•˜๊ธฐ

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Swift] ๋ฐฐ์—ด ์•ˆ์ „ํ•˜๊ฒŒ ์กฐํšŒํ•˜๊ธฐ  (0) 2023.02.04
[Swift] Optional  (0) 2023.02.04
[Swift] ๋ฉ”ํƒ€ํƒ€์ž…  (0) 2023.02.03
[Swift] map ์‚ผํ˜•์ œ(map, compactMap, flatMap)  (0) 2023.02.03
[Swift] Protocol  (0) 2023.02.03
    'Swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Swift] Optional
    • [Swift] ๋ฉ”ํƒ€ํƒ€์ž…
    • [Swift] map ์‚ผํ˜•์ œ(map, compactMap, flatMap)
    • [Swift] Protocol
    longlivedrgn
    longlivedrgn

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”