swift 0x17
Generics
문현진(arnold@css99.co.kr)
오늘은 뭘 바를까? 이번 신상은 뭘까? 궁금한 언니들은 구글 플레이에
서 “마메스"를 검색하세요.
제네릭이 필요 할 때
swapTwoInts swapTwoStrings swapTwoDoubles
?
제네릭 함수들
func swapTwoValues<T>(inout a: T, inout b: T) {
let temporaryA = a
a = b
b = temporaryA
}
타입 파라메터
T?
타입 파라메터
ABCDEFGHIJKLMNOPQR...?
타입 파라메터 이름
KeyType? MyName?
타입 파라메터 이름
UpperCamelCase
타입 파라메터 이름
제네릭 타입들
제네릭 타입들
비 제네릭
struct IntStack {
var items = Int[]()
mutating func push(item: Int) {
items.append(item)
}
mutating func pop() -> Int {
return items.removeLast()
}
}
제네릭 타입들
제네릭
struct Stack<T> {
var items = T[]()
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
}
제네릭 타입들
var stackOfStrings = Stack<String>()
stackOfStrings.push("uno")
stackOfStrings.push("dos")
stackOfStrings.push("tres")
stackOfStrings.push("cuatro")
타입 제약 문법
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
// function body goes here
}
타입 제약 문법
func findIndex<T>(array: [T], valueToFind: T) -> Int? {
for (index, value) in enumerate(array) {
if value == valueToFind {
return index
}
}
return nil
}
타입 제약 문법
func findIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? {
for (index, value) in enumerate(array) {
if value == valueToFind {
return index
}
}
return nil
}
연관 타입 활용
protocol Container {
typealias ItemType mutating func append(item: ItemType)
var count: Int { get } subscript(i: Int) -> ItemType { get } }
연관 타입 활용
struct IntStack: Container {
// original IntStack implementation
var items = Int[]()
mutating func push(item: Int) {
items.append(item)
}
mutating func pop() -> Int {
return items.removeLast()
}
// conformance to the Container protocol
typealias ItemType = Int mutating func append(item: Int) {
self.push(item)
} var count: Int {
return items.count
} subscript(i: Int) -> Int {
return items[i]
} }
연관 타입 활용
struct Stack<T>: Container {
// original Stack<T> implementation
var items = T[]() mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
// conformance to the Container protocol
mutating func append(item: T) {
self.push(item)
} var count: Int {
return items.count
} subscript(i: Int) -> T {
return items[i]
} }
기존 타입을 연관 타입을 지정 할 수 있도록 확
장 하기
extension Array: Container {}
where
func allItemsMatch<
C1: Container, C2: Container
where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>
(someContainer: C1, anotherContainer: C2) -> Bool {
// check that both containers contain the same number of items
if someContainer.count != anotherContainer.count {
return false
}
// check each pair of items to see if they are equivalent
for i in 0..someContainer.count {
if someContainer[i] != anotherContainer[i] {
return false
}
}
// all items match, so return true
return true
}

Swift 0x17 generics

Editor's Notes

  • #3 두 개의 숫자 또는 문자열을 교환하는 함수이다. 여러가지 종류가 있다. 모든 타입을 고려하려면?
  • #10 이걸 설명 하기 전에 스택을 예제로 들것 이기 때문에 스택의 특성을 본다.
  • #15 이 함수는 에러가 납니다. 왜냐면 타입 T가 반드시 비교가 가능한 == 연산자와 != 를 사용 할 수 있다는 보장이 없기 때문입니다.
  • #16 이 함수는 에러가 납니다. 왜냐면 타입 T가 반드시 비교가 가능한 == 연산자와 != 를 사용 할 수 있다는 보장이 없기 때문입니다.