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가 아니면 안된다.