- 제네릭스 : 타입에 대한 추상화를 시키는 프로그램 기법으로 타입별로 작성할 필요없이 어떤 타입이든 적용가능하다.
- 사용방법
- 배열에서의 사용 : 배열 정의 시에 Element 키워드를 이용하여 타입 추상화를 시킴배열에서의 제네릭스
// 제네릭스 프로그램 기법 이용한 배열 선언
struct Array<Element> {
func append(_ newElement : Element) -> Void
func remove(at index : Int) -> Element
}
// 선언한 배열 사용
// String 형 배열
var strArray = Array<String>()
strArray.append("Hello")
strArray.append("Swift")
strArray.remove(at index : 0)
// Int 형 배열
var intArray = Array<Int>()
intArray.append(10)
intArray.append(11.1) // 에러 발생
/* Swift는 강한 타입 체크로 Int형 값을 넣으라는 에러 발생 */ - Dictionary에서의 사용(두 종류 타입 추상화 가능 )Dictionary에서의 제네릭스
// 제네릭스 프로그램 기법 이용한 Dictionary 선언
struct Dictionary<Key : Hashable, Value> {
func updateDicValue(_ value : Value, forKey : Key) -> Value?
func remoteDicValue(forKey : Key) -> Value?
}
// 선언한 Dictionary 사용
// Key가 Int, Value가 String인 Dictionary
var intAndstrDic = Dictionary<Int, String>()
intAndstrDic.updateDicValue("Hello", 0)
var strAndstrArrayDic = Dictionary<String, [String]>()
strAndstrArrayDic.updateDicValue("1월", ["Jan","1M"]) - 함수에서의 사용함수에서의 제네릭스
// 출력함수에 어떤 타입이든 출력가능하게 제네릭스로 선언
func printValue<T> (_ value : T) {
print("데이터 출력 : \(value)")
}
// 타입에 상관없이 출력 가능
printValue("Hello") // 데이터 출력 : Hello 출력
printValue(3) // 데이터 출력 : 3 출력 - 클래스에서의 사용클래스에서의 제네릭스
// 타입 추상화를 이용하여 클래스 선언
class Hospital<T> {
func inHospital(patient : T) {
print("병원에 입원")
}
}
// Human
class Human {}
// Pet
class Pet {}
// Hospital 클래스 선언 : Human 클래스를 이용
var hospital = Hospital<Human>()
// Hospital 클래스 선언 : Pet 클래스를 이용
var petHospital = Hospital<Pet>()