Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

제네릭 타입 #6

Closed
Brandnew-one opened this issue May 18, 2022 · 0 comments
Closed

제네릭 타입 #6

Brandnew-one opened this issue May 18, 2022 · 0 comments

Comments

@Brandnew-one
Copy link
Owner

Brandnew-one commented May 18, 2022

제네릭 타입

Type Parameter

코드를 보다보면 함수과 같이 <>로 감싸진 형태를 쉽게 찾아볼 수 있다. 이때 T는 타입 파라미터로 어떤 타입의 ‘이름'을 의미한다.

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

말그대로 어떤 ‘타입’ 을 의미하기 때문에 컴파일 과정에서 해당 타입이 어떤 타입인지 결정되지 않고 런타임 과정에서 타입을 결정한다

예를 들어서, C++ STL에 있는 Stack을 구현한다면 아래와 같이 제네릭 타입을 이용해서 타입에 무관한 Stack을 만들 수 있다.

struct Stack<T> {
    var items = [T]()
    mutating func push(item: T) {
        items.append(item)
    }
    mutating func pop() -> T {
        return items.removeLast()
    }
}

Type Constraint

아래와 같은 형태는

struct TextFieldCustomViewWrapper<KeyboardView: View>: UIViewRepresentable {
}

KeyboardView 라는 타입파라미터를 사용하는데 KeyboardView는 View 프로토콜을 채택하고 있는 어떤 타입

을 의미한다. 이렇게 특정 프로토콜을 준수해야만 제네릭을 사용할 수 있도록 타입 제약을 줄 수 있다.

Swift 의 Dictionary 구조체를 들여다 보면 아래와 같이 타입 제약이 걸려있는 것을 확인할 수 있다.

@frozen struct Dictionary<Key, Value> where Key : Hashable

즉 Key가 Hashable 프로토콜을 채택하는 타입인 경우에만 사용할 수 있도록 제약이 걸려있다.

Associated Type

protocol Publisher {
  associatedtype Output
  associatedtype Failure : Error
  func receive<S>(subscriber: S) 
		where S : Subscriber, Self.Failure == S.Failure, Self.Output == S.Input
}

프로토콜을 보다보면 associatedType이라는 키워드를 볼 수 있다. associated Type 이니까 우리가 일반적으로 생각하는 Type임을 유추할 수 있다.

예시와 함께 보면 어떤 의미를 가지는지 알 수 있다.

protocol BranProtocol {
	associatedtype MyType
	var name: MyType { get }
}

struct Bran: BranProtocol {
	var name: String {
		return "Sangwon"
	}
}

BranProtocol을 채택하면 MyType의 name을 정의해야 하는데 String 타입이외에도 다른 다양한 타입의 name이 될 수 있는 가능성이 있을 때 위와 같이 associatedtype을 사용할 수 있다.

(프로토콜에서 사용하는 제네릭 타입으로 생각!)

위의 제네릭에서 봤던 예제와 마찬가지로 연관타입에도 프로토콜을 통해서 제약을 줄 수 있다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant