Swift 제네릭스

  1. 제네릭스 : 타입에 대한 추상화를 시키는 프로그램 기법으로 타입별로 작성할 필요없이 어떤 타입이든 적용가능하다.
  2. 사용방법
    1. 배열에서의 사용 : 배열 정의 시에 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형 값을 넣으라는 에러 발생 */
    2. 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"])
    3. 함수에서의 사용
      함수에서의 제네릭스
      // 출력함수에 어떤 타입이든 출력가능하게 제네릭스로 선언
      func printValue<T> (_ value : T) {
         print("데이터 출력 : \(value)")
      }

      // 타입에 상관없이 출력 가능
      printValue("Hello") // 데이터 출력 : Hello 출력
      printValue(3) // 데이터 출력 : 3 출력
    4. 클래스에서의 사용
      클래스에서의 제네릭스
      // 타입 추상화를 이용하여 클래스 선언
      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>()