iOS/Swift

[Swift] Generics에 λŒ€ν•΄μ„œ

κ²½ν‘Έ 2023. 3. 9. 18:30
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”~

 

μ˜€λŠ˜μ€ Generics에 λŒ€ν•΄μ„œ 정리해보렀고 ν•©λ‹ˆλ‹€.

 

Swiftμ—μ„œ Generics μ‚¬μš©ν•˜κΈ°

GenericsλŠ” Swift의 κ°•λ ₯ν•œ κΈ°λŠ₯ 쀑 ν•˜λ‚˜λ‘œ

ν•¨μˆ˜, λ©”μ„œλ“œ, 클래슀, μ—΄κ±°ν˜• λ“±μ—μ„œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

 

특히, μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ—μ„œ λ™μž‘ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, Int λ°°μ—΄, String λ°°μ—΄ λ˜λŠ” λͺ¨λ“  νƒ€μž…μ˜ 배열을 λ‹€λ£¨λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ ν•¨μˆ˜λ₯Ό μΌλ°˜ν™”ν•˜μ—¬ λ°°μ—΄ λ‚΄λΆ€μ˜ λͺ¨λ“  값에 λŒ€ν•΄ λ™μž‘ν•˜λ„λ‘ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

Generics의 ꡬ문

GenericsλŠ” λ‹€μŒκ³Ό 같은 ꡬ문으둜 μž‘μ„±λ©λ‹ˆλ‹€.

 

func functionName<T>(parameter1: T, parameter2: T) {
	
}

 

TλŠ” μž„μ˜μ˜ νƒ€μž…μ„ λ‚˜νƒ€λ‚΄λŠ” 일반적인 μ΄λ¦„μž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œ, ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ 및 λ°˜ν™˜ 값은 T νƒ€μž…μœΌλ‘œ μ„ μ–Έλ©λ‹ˆλ‹€.

T λŒ€μ‹  μ›ν•˜λŠ” 문자λ₯Ό μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, λ³΄ν†΅μ˜ 경우 Tλ₯Ό μ‚¬μš©ν•œλ‹€κ³  ν•©λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, Int 값을 λ”ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

func addInts<T: Numeric>(a: T, b: T) -> T {
    return a + b
}

 

이 ν•¨μˆ˜λŠ” μž„μ˜μ˜ Numeric νƒ€μž… T에 λŒ€ν•΄μ„œλ§Œ λ™μž‘ν•©λ‹ˆλ‹€.

Numeric ν”„λ‘œν† μ½œμ€ 숫자λ₯Ό λ‚˜νƒ€λ‚΄λŠ” νƒ€μž…μ— μ μš©λ˜λŠ”λ° Int, Double, Float λ“±μ˜ νƒ€μž…μ΄ 이 ν”„λ‘œν† μ½œμ„ λ”°λ₯΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

let answer1 = addInts(a: 3, b: 4) // 7
let answer2 = addInts(a: 3.1, b: 22.5) // 25.6

 

GenericsλŠ” λ°°μ—΄μ—μ„œλ„ μ‚¬μš©ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

func sortArray<T: Comparable>(array: [T]) -> [T] {
    return array.sorted()
}

 

μœ„ ν•¨μˆ˜λŠ” Comparable νƒ€μž… T에 λŒ€ν•΄μ„œλ§Œ λ™μž‘ν•©λ‹ˆλ‹€.

Comparable ν”„λ‘œν† μ½œμ€ 비ꡐ κ°€λŠ₯ν•œ 값에 μ μš©λ©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ Int, String λ“±μ˜ νƒ€μž…μ΄ 이 ν”„λ‘œν† μ½œμ„ λ”°λ₯΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

μœ„μ˜ ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

let intArray = [3, 1, 2, 9]
let sortedIntArray = sortArray(array: intArray) // [1, 2, 3, 9]

let stringArray = ["a", "C", "d", "b"]
let sortedStringArray = sortArray(array: stringArray) // ["a", "b", "c", "d"]

 

Generics의 ν™œμš© μ˜ˆμ‹œ

1. νƒ€μž…μ— λŒ€ν•œ 일반적인 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

 

func swapValues<T: Int>(a: inout T, b: inout T) {
    let temp = a
    a = b
    b = temp
}

μœ„ μ½”λ“œμ—μ„œ, swapValues ν•¨μˆ˜λŠ” μž„μ˜μ˜ νƒ€μž… T에 λŒ€ν•΄ λ™μž‘ν•˜λŠ”λ° 두 값을 κ΅ν™˜ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

2. 같은 ν”„λ‘œν† μ½œμ„ λ”°λ₯΄λŠ” 객체λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  λ•Œ

 

protocol animal {
    var bark: String { get }
}

struct Dog: animal {
    var bark: String
}

struct Cat: animal {
    var bark: String
}

func printAnimalBark<T: animal>(animal: T) {
    print(animal.bark)
}

printAnimalBark(animal: Dog(bark: "멍멍")) // 멍멍
printAnimalBark(animal: Cat(bark: "μ•Όμ˜Ή")) // μ•Όμ˜Ή

 

 

μœ„ μ½”λ“œμ—μ„œ, Animal ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜λŠ” Dog와 Cat ꡬ쑰체λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

printAnimalBark ν•¨μˆ˜λŠ” μž„μ˜μ˜ Animal νƒ€μž… T에 λŒ€ν•΄ μž‘λ™ν•©λ‹ˆλ‹€.

 

μœ„μ˜ μ˜ˆμ‹œ 말고도 

자료ꡬ쑰(μŠ€νƒ, 큐 λ“±)λ₯Ό κ΅¬ν˜„ν•  λ•Œ, λ„€νŠΈμ›Œν¬ 응닡에 λŒ€ν•œ 처리λ₯Ό ν•  λ•Œ λ“± μ‚¬μš©ν•˜λŠ” 곳이 ꡉμž₯히 λ§ŽμŠ΅λ‹ˆλ‹€. 

좔후에 κΈ°νšŒκ°€ λœλ‹€λ©΄ 더 λ§Žμ€ μ˜ˆμ‹œλ“€λ„ ν•¨κ»˜ μž‘μ„±ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

그럼 이만 πŸ‘‹πŸ» πŸ‘‹πŸ» πŸ‘‹πŸ»

 

λ°˜μ‘ν˜•