generic

작성일

generic

  • 타입이 여러가지일때 사용
  • <Type내가 정한 임의의 타입>
struct IntStack {
  
  var items = [Int]()

  mutating func push(item: Int) {
    items.append(item)
  }

  mutating func pop() -> Int? {
    if items.isEmpty {
      return nil
    }
    return items.reomveLast() //마지막껄 꺼내고 지운다.
  }
}

var myStack = IntStack()

myStack.push(item: 4)
myStack.push(item: 5)
myStack.push(item: 6)

myStack.pop()
myStack.pop()
myStack.pop()

struct 구조는 벨류타입이라서 안에있는 데이터를 스스로 변경이 불가능하다.
따라서. mutating을 붙여줘야한다.
저렇게 스텍을 push하고 pop으로 사라지게 할수 있다.
만약에 이렇게 Int로 받아오기로 정했는데,
갑자기 String값을 넣어야할떄가 있다 그러면 저 코드는 오류가난다.
따라서, 이럴때 <>제네릭을 사용하는 것이다.
코드를 바꿔보면

struct MyStack<MyType> {
  
  var items = [MyType]()

  mutating func push(item: MyType) {
    items.append(item)
  }

  mutating func pop() -> MyType? {
    if items.isEmpty {
      return nil
    }
    return items.reomveLast() //마지막껄 꺼내고 지운다.
  }
}

var myStack = MyStack<String>() //이렇게 사용하는 곳에서 무슨타입을 사용할건지 정해줘야한다.
myStack.push(item: "a")
myStack.pop()

var myStack2 = MyStack<Int>()
myStack2.push(item: 3)
myStack2.pop()

이렇게 두 타입모두 사용이 가능해진다.
사용할때 타입을 지정해주면 된다.
제한을 둘수도 있다.

struct MyStack<MyType> where MyType: (내가만든타입) {
}

struct를 생성할때 이렇게 내가만든타입을 넣으면 제한이 가능하다.
단, Protocol이나, Class가 아니면 안된다.