개발하는 동글 :]

[TIL],[Swift],[Generics(제네릭) 공부해 보기!][1] 본문

카테고리 없음

[TIL],[Swift],[Generics(제네릭) 공부해 보기!][1]

동글하다 2023. 9. 20. 23:40

1. 프로토콜 제약

func testFunc<T>(num1:T, num2:T) -> Bool{
    return num1 == num2
}

testFunc(num1: 1, num2: 1)
이러한 제네릭 함수가 있다고 가정해 보자.
이 함수는 컴파일러에서 "Binary operator '==' cannot be applied to two 'T' operands"라는 에러를 알려준다
즉 이진 연산자 == 은 T라는 것에 적용할 수 없다는 것이다.
왜 이런 일이 발생할까?
T는 Equatable 프로토콜을 채택하고 있지 않기 때문에 == 연산자를 사용할 수 없다.
그렇다면 문제를 해결하는 방법은 무엇일까?
func testFunc<T:Equatable>(num1:T, num2:T) -> Bool{
    return num1 == num2
}

testFunc(num1: 1, num2: 1)
당연하게도 T가 Equatable 프로토콜을 채택한다면 == 연산자를 사용할 수 있기에 정상적으로 기능이 동작하고
testFunc 함수의 파라미터에는 Equatable이란 프로토콜을 준수하는 파라미터만 받을 수 있다.

Equatable 프로토콜을 TestModel에서 채택하지 않아서 컴파일 시 에러

Equatable 프로토콜을 채택하여 Error가 없어진 것을 확인할 수 있음.

2. 클래스 제약

클래스에서도 프로토콜과 동일하다고 생각한다.
printName 함수의 T는 Human 타입을 사용하기 때문에 bird라는 인스턴스는 함수의 파라미터로 전달할 수가 없다.
하지만 Human 타입의 인스턴스와 그것을 상속한 Teacher는 파라미터로 전달이 가능한 것을 확인할 수 있다.

3. Reference

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/generics/

https://babbab2.tistory.com/136

 

4. TIL

4.1오늘의 회고

1. 제네릭을 프로토콜과 클래스에서 사용하는 방법을 정리해 보았다.

2. 스터디에서 진행하는 프로젝트의 담당 페이지의 UI작업을 진행하였다.

4.2 내일의 목표

1. Generics에 관한 부분을 공부하는 것을 하지 않았기에 조금 더 Generics의 활용과 다양한 문법을 공부해 보자.

2. 프로토콜과 Enum까지..!

3. 스터디에 진행하는 프로젝트의 작업

4. 캠프에서 진행하는 과제의 마무리 작업