Swift
기본 문법 <제네릭>
pockpock
2024. 6. 15. 22:33
Swift 제네릭 정리
Swift에서 제네릭은 코드 재사용성을 높이고, 타입에 독립적인 함수, 구조체, 클래스, 열거형 등을 작성할 수 있게 해준다.
제네릭 함수
제네릭 함수는 타입 매개변수를 사용하여 다양한 타입에 대해 동작하는 함수를 작성할 수 있게 해준다.
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
제네릭 타입
제네릭 타입은 구조체, 클래스, 열거형에서 사용되어 다양한 타입에 대해 동작하는 타입을 정의할 수 있게 해준다.
//제네릭 구조체
struct Stack<Element> {
var items = [Element]()
mutating func push(_ item: Element) {
items.append(item)
}
mutating func pop() -> Element {
return items.removeLast()
}
}
//제네릭 클래스
class Box<T> {
var value: T
init(value: T) {
self.value = value
}
}
//제네릭 열거형
enum Result<Value> {
case success(Value)
case failure(Error)
}
타입 제약
타입 제약은 제네릭 타입이 특정 프로토콜을 준수해야 함을 명시해준다.
func findIndex<T: Equatable>(of valueToFind: T, in array: [T]) -> Int? {
for (index, value) in array.enumerated() {
if value == valueToFind {
return index
}
}
return nil
}
연관 타입
연관 타입은 프로토콜에서 제네릭 타입을 정의할 때 사용한다.
protocol Container {
associatedtype Item
mutating func append(_ item: Item)
var count: Int { get }
subscript(i: Int) -> Item { get }
}
제네릭 서브스크립트
제네릭 서브스크립트는 서브스크립트에 제네릭을 사용할 수 있게 해준다.
extension Dictionary {
subscript<Index: Hashable>(index: Index) -> Value? {
get {
return self[index as! Key]
}
set {
self[index as! Key] = newValue
}
}
}