애플 스위프트 언어 개발 가이드를 기반으로 초기화 관련된 내용을 정리했습니다. 초기화가 복잡합니다. 크게 복잡하지 않을 수도 있는 내용이지만 언어마다 조금씩 다른 부분을 잘 정리했습니다.
http://cafe.naver.com/architect1 에서 스터디 진행중입니다.
기본적인 뼈대는 http://swift.leantra.kr/ 를 기반으로 합니다.
제네릭 타입들
var stackOfStrings= Stack<String>()
stackOfStrings.push("uno")
stackOfStrings.push("dos")
stackOfStrings.push("tres")
stackOfStrings.push("cuatro")
13.
타입 제약 문법
funcsomeFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
// function body goes here
}
14.
타입 제약 문법
funcfindIndex<T>(array: [T], valueToFind: T) -> Int? {
for (index, value) in enumerate(array) {
if value == valueToFind {
return index
}
}
return nil
}
15.
타입 제약 문법
funcfindIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? {
for (index, value) in enumerate(array) {
if value == valueToFind {
return index
}
}
return nil
}
16.
연관 타입 활용
protocolContainer {
typealias ItemType mutating func append(item: ItemType)
var count: Int { get } subscript(i: Int) -> ItemType { get } }
17.
연관 타입 활용
structIntStack: 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]
} }
18.
연관 타입 활용
structStack<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]
} }
19.
기존 타입을 연관타입을 지정 할 수 있도록 확
장 하기
extension Array: Container {}
20.
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
}
Editor's Notes
#3 두 개의 숫자 또는 문자열을 교환하는 함수이다. 여러가지 종류가 있다. 모든 타입을 고려하려면?