본 내용은 '스위프트 프로그래밍' 책을 학습한 후 이를 바탕으로 작성한 글입니다.
타입 또는 메서드 이름 <타입 매개변수>
struct Stack<Element> {
var items = [Element]()
mutating func push(_ item: Element) {
items.append(item)
}
mutating func pop() -> Element {
return items.removeLast()
}
}
var intStack: Stack<Int> = Stack<Int>()
var doubleStack: Stack<Double> = Stack<Double>()
intStack.push(1)
intStack.push(2)
intStack.push(3)
print(intStack) //Stack<Int>(items: [1, 2, 3])
doubleStack.push(1.0)
doubleStack.push(2.0)
doubleStack.push(3.0)
print(doubleStack) //Stack<Double>(items: [1.0, 2.0, 3.0])
where
절을 이용한다.func swapTwoValues<T: BinaryInteger>(_ a: inout T, _ b: inout T) {
// 함수 구현
}
//제네릭 타입 제약 추가
func swapTwoValuesPlusConstraint<T: BinaryInteger>(_ a: inout T, _ b: inout T)
where T: FloatingPoint {
//함수 구현
}
protocol Container {
associatedtype ItemType
var count: Int { get }
mutating func append(_ item: ItemType)
subscript(i: Int) -> ItemType { get }
}
class MyContainer: Container {
var items: Array<Int> = Array<Int>()
var count: Int {
return items.count
}
func append(_ item: Int) {
items.append(item)
}
subscript(i: Int) -> Int {
return items[i]
}
}
protocol Container {
associatedtype ItemType
var count: Int { get }
mutating func append(_ item: ItemType)
subscript(i: Int) -> ItemType { get }
}
struct Stack<Element>: Container {
var items = [Element]()
mutating func push(_ item: Element) {
items.append(item)
}
mutating func pop() -> Element {
return items.removeLast()
}
mutating func append(_ item: Element) {
self.push(item)
}
var count: Int {
return items.count
}
subscript(i: Int) -> Element {
return items[i]
}
}
extension Stack {
subscript<Indices: Sequence>(indices: Indices) -> [Element]
where Indices.Iterator.Element == Int {
var result = [ItemType]()
for index in indices {
result.append(self[index])
}
return result
}
}
var intStack: Stack<Int> = Stack<Int>()
intStack.append(1)
intStack.append(2)
intStack.append(3)
intStack.append(4)
intStack.append(5)
print(intStack[0...2]) //[1, 2, 3]