iOS/Swift Grammar

[Swift] 제네릭 문법

kyxxn 2024. 2. 15. 14:27
728x90

제네릭

제네릭은 스위프트의 어떤 타입에도 유연하게 대응할 수 있으며 코드의 중복을 줄이는 기능이다.
또한, 제네릭으로 구현한 기능과 타입은 재사용에도 쉬우며 Array, Dictionary, Set 등의 타입은 모두 제네릭 컬렉션이다.

import Foundation

func swapTwoInt(_ a: inout Int, _ b: inout Int) {
    let tmp: Int = a
    a = b
    b = tmp
}

var intOne: Int = 10
var intTwo: Int = 50

print("intOne : \(intOne) | intTwo : \(intTwo)")
swapTwoInt(&intOne, &intTwo)
print("intOne : \(intOne) | intTwo : \(intTwo)")

func swapTwoString(_ a: inout String, _ b: inout String) {
    let tmp: String = a
    a = b
    b = tmp
}

var strOne: String = "A"
var strTwo: String = "B"

print("strOne : \(strOne) | strTwo : \(strTwo)")
swapTwoString(&strOne, &strTwo)
print("strOne : \(strOne) | strTwo : \(strTwo)")

 

위처럼 모든 변수 타입에 대응하는 함수와 같이 지저분한 코드를

제네릭을 사용하게 된다면, 아래와 같이 바꿀 수 있다.

 

제네릭 문법은 메소드 이름 옆에 <제네릭 타입 명>으로 명시해두고,

해당 타입을 다른 타입과 같이 사용하면 된다.

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let tmp: T = a
    a = b
    b = tmp
}

var intOne: Int = 10
var intTwo: Int = 50

print("intOne : \(intOne) | intTwo : \(intTwo)")
swapTwoValues(&intOne, &intTwo)
print("intOne : \(intOne) | intTwo : \(intTwo)")

var strOne: String = "A"
var strTwo: String = "B"

print("strOne : \(strOne) | strTwo : \(strTwo)")
swapTwoValues(&strOne, &strTwo)
print("strOne : \(strOne) | strTwo : \(strTwo)")