제네릭
특정 형식과 연관되지 않은 함수를 구현하는 방법
func name<T>(parameters) -> Type {
code
}
- <T> : 타입 파라미터, 함수 내부터에 타입 파라미터나 리턴형으로 활용됨 (다른 이름을 사용해도 됨)
형식에 관계없이 모든 값을 파라미터로 전달할 수 있음
// Generics
func swapValue<T>(left: inout T, right: inout T) {
let tmp = left
left = right
right = tmp
}
var a = 1
var b = 10
swapValue(left: &a, right: &b)
print(a, b) // 10, 1
var c = 4.5
var d = 6.8
swapValue(left: &c, right: &d)
제네릭에 제한주기
제네릭 타입에는 제한이 없기 때문에 Equatable 프로토콜을 채택하기 때문에 사용할 수 있는 비교 연산자인 ==을 사용하려고 하면 에러가 발생함 그래서 직접 기능을 구현해주거나 조건을 걸어주어야함
func swapValue<T: Equatable>(left: inout T, right: inout T) {
let tmp = left
left = right
right = tmp
}
타입이 비교가 가능한 값으로 제한범위가 생기는 것
+) 만약 제네릭과 동일한 이름을 가진 함수를 만들 경우, 함수가 제네릭보다 우선순위가 높기 때문에 함수에서 설정한 파라미터의 타입으로 함수를 실행할 경우 그 함수가 실행됨 (나머지는 제네릭 실행)
제네릭의 타입추론
struct Color<T> {
var red: T
var green: T
var blue: T
}
var c = Color(red: 128, green: 80, blue: 200) // c의 타입은 Int
led d: Color(red: 128.0, green: 80.0, blue: 200.0) // d의 타입은 Double
여기서 타입 추론을 사용하지 않을거면 직접 설정해주면 됨
let c: Color<Int>
let d: Color<Double>
배열로 생각해보면 쉬움
let arr: Array<Int>
let arr = [1, 2, 3, 4]
제네릭의 확장
- 기본 확장과 동일하게 이름으로 확장할 수 있으며 타입 파라미터인 T의 이름은 바꿀 수 없음
- where절을 통해서 제한을 둘 수 있음
- 현재는 Int가 채택중인 FixedWidthInteger 프로토콜로 제한 준 경우
- 그래서 FixedWidthInteger를 채용하는 것들만 사용 가능한 함수가 되어버림
- 여기서 Int만 사용하게 하고 싶다하면 아예 T == Int 로 설정해줄 수 있음
extension Color where T: FixedWidthInteger{
func getComponents() -> [T] {
return [red, green, blue]
}
}
var intColor = Color(red: 1, green: 1, blue: 1)
intColor.getComponents()
var doubleColor = Color(red: 1.0, green: 1.0, blue: 1.0)
// 🔴 오류 발생 !!!! 🔴 함수 사용 불가
doubleColor.getComponents()
제네릭의 연관 형식 - 프로토콜을 제네릭하게 사용할 수 있게해줌
protocol QueueCompatible {
associatedtype Element
func enqueu(value: Element)
func dequeue() -> Element?
}
class IntegerQueue: QueueCompatible {
typealias Element = Int
func enqueu(value: Int) {
}
func dequeue() -> Int? {
return 0
}
}
Typealias 생략해도 됨, 형식 추론 가능함
class doubleQueue: QueueCompatible {
func enqueu(value: Double) {
}
func dequeue() -> Double? {
return 0
}
}
만약에 제한을 주고 싶다면..
associatedtype Element: Equatable
'Swift > Swift 기초문법' 카테고리의 다른 글
[Swift 기초문법] Error Handling을 알아보자 (0) | 2023.07.17 |
---|---|
[Swift 기초문법] @State, @Binding 을 알아보자 (0) | 2023.07.10 |
[Swift 기초문법] Property를 알아보자 (0) | 2023.06.16 |
[Swift 기초문법] Closure 를 알아보자 (2) | 2023.06.16 |
[Swift 기초문법] Optional Chaining에 대해 알아보자 (2) | 2023.03.02 |