SlideShare ist ein Scribd-Unternehmen logo
1 von 12
Downloaden Sie, um offline zu lesen
NHN	NEXT	Eunjoo	Im
Swift3
Generic
NHN NEXT

Swift3 Sutdy
NHN	NEXT	Eunjoo	Im
Generic

소개
▪ Generic code를 사용하면 타입을 제한하지 않으므로 중복
감소 및 의도의 명시적 표현 가능

▪ Swift의 중요 기능 중 하나로 많은 표준 라이브러리가 사용

▪ Int, String 등 컬렉션에 들어가는 타입을 명시하지 않고 어
느 타입이나 담을 수 있음
출처: Apple Inc. The Swift Programming Language (Swift 3.0.1)
func swapTwoInts(_ a: inout Int, _ b: inout Int) {

let temporaryA = a

a = b

b = temporaryA

}
func swapTwoValues<T>(_ a: inout T, _ b: inout
T) {

let temporaryA = a

a = b

b = temporaryA

}

var someString = "hello"

var anotherString = "world"

swapTwoValues(&someString, &anotherString)
일반 function Generic function
type parameter

ex) Dictionary<Key, Value>
NHN	NEXT	Eunjoo	Im
Generic

Type
▪ Array, Dictionary에 타입 제한 없이 넣을 수 있던 것처럼,
커스텀 class, structure, enumeration이 어떤 타입이라
도 사용할 수 있도록 할 수 있음
출처: Apple Inc. The Swift Programming Language (Swift 3.0.1)
struct IntStack {

var items = [Int]()

mutating func push(_ item: Int) {

items.append(item)

}

mutating func pop() -> Int {

return items.removeLast()

}

}
struct Stack<Element> {

var items = [Element]()

mutating func push(_ item: Element) {

items.append(item)

}

mutating func pop() -> Element {

return items.removeLast()

}

}
일반 stack Generic function
NHN	NEXT	Eunjoo	Im
Generic

Type
▪ Array, Dictionary에 타입 제한 없이 넣을 수 있던 것처럼,
커스텀 class, structure, enumeration이 어떤 타입이라
도 사용할 수 있도록 할 수 있음
출처: Apple Inc. The Swift Programming Language (Swift 3.0.1)
struct IntStack {

var items = [Int]()

mutating func push(_ item: Int) {

items.append(item)

}

mutating func pop() -> Int {

return items.removeLast()

}

}
struct Stack<Element> {

var items = [Element]()

mutating func push(_ item: Element) {

items.append(item)

}

mutating func pop() -> Element {

return items.removeLast()

}

}

var stackOfStrings = Stack<String>()

stackOfStrings.push("one")

stackOfStrings.push("two")
일반 stack
Generic stack
NHN	NEXT	Eunjoo	Im
Generic

Type

확장
▪ 확장 시 type parameter를 정의할 필요 없이 기존 타입
정의를 그대로 사용할 수 있음
출처: Apple Inc. The Swift Programming Language (Swift 3.0.1)
struct Stack<Element> {

var items = [Element]()

mutating func push(_ item: Element) {

items.append(item)

}

mutating func pop() -> Element {

return items.removeLast()

}

}
// topItem이라는 읽기 전용 computed property 추가

extension Stack {

var topItem: Element? {

return items.isEmpty ? nil : items[items.count - 1]

}

}
기존 generic stack extension generic stack
기존 type parameter를 사용
NHN	NEXT	Eunjoo	Im
Type

제약
▪ 모든 type을 받지 않고 특정 조건을 만족하는 타입만 사용
하도록 할 수 있음

▪ Swift Dictionary의 경우 Hashable 프로토콜을 따르는 타
입만 key로 사용 가능 (String, Int, Double, Bool)
출처: Apple Inc. The Swift Programming Language (Swift 3.0.1)
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) { // }type 제약 문법
func findIndex(ofString valueToFind:
String, in array: [String]) -> Int? {

for (index, value) in array.enumerated() {

if value == valueToFind {

return index

}

}

return nil

}
func findIndex<T: Equatable>(of valueToFind: T, in
array:[T]) -> Int? {

for (index, value) in array.enumerated() {

if value == valueToFind {

return index

}

}

return nil

}
T: Equatable

Equatable protocol을 따르는 T

안넣으면 == 조건문을 지원하지
않는 타입이 있으므로 에러
String array에서 특정 String 탐색 array에서 특정 T 탐색
NHN	NEXT	Eunjoo	Im
연관

Type
▪ protocol의 일부로 사용될 type의 이름을 정의

▪ protocol 정의 시 함께 정의하면 편리함

▪ 실제 protocol이 적용될 때 사용됨

▪ associatedtype 키워드 사용
출처: Apple Inc. The Swift Programming Language (Swift 3.0.1)
// Container 프로토콜에서 ItemType이라는 연관 타입 정의

protocol Container {

associatedtype ItemType

mutating func append(_ item: ItemType)

var count: Int { get }

subscript(i: Int) -> ItemType { get }

}
append(_:) 메서드로

container에

새 아이템 추가 가능
Int 값을 반환하는 count 프로퍼티로
아이템 수 계산 가능
Int 인덱스 subsctipt를 통해 아이템에 접근 가능
NHN	NEXT	Eunjoo	Im
출처: Apple Inc. The Swift Programming Language (Swift 3.0.1)
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<Element>: Container {

// original Stack<Element> implementation

var items = [Element]()

mutating func push(_ item: Element) {

items.append(item)

}

mutating func pop() -> Element {

return items.removeLast()

}

// conformance to the Container protocol

mutating func append(_ item: Element) {

self.push(item)

}

var count: Int {

return items.count

}

subscript(i: Int) -> Element {

return items[i]

}

}
Container 프로토콜을 따르는 IntStack Container 프로토콜을 따르는 generic Stack
ItemType을 Int로 변환
append(_:) 메서드가
Element를 사용하므로

자동으로 타입 추론
NHN	NEXT	Eunjoo	Im
Generic

Where문
▪ generic where문을 정의하여 연관 타입의 요구 사항을 정
의할 수 있음

▪ 연관 타입이 따라야할 프로토콜을 지정하거나, 특정 type
parameter와 일치하도록 지정할 수 있음
출처: Apple Inc. The Swift Programming Language (Swift 3.0.1)
// 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

}
func allItemsMatch<C1: Container, C2: Container>

(_ someContainer: C1, _ anotherContainer: C2) -
> Bool

where C1.ItemType == C2.ItemType,

C1.ItemType: Equatable {



// Check that both containers

contain the same number of items.

if someContainer.count !=

anotherContainer.count {

return false

}
C1과 C2는 Container 프로토콜을 따름
C2의 ItemType은 Equatable을 따름
C1과 C2의 ItemType은 동일
NHN	NEXT	Eunjoo	Im
Generic

Where문
출처: Apple Inc. The Swift Programming Language (Swift 3.0.1)
var stackOfStrings = Stack<String>()

stackOfStrings.push("one")

stackOfStrings.push("two")

stackOfStrings.push("three")



var arrayOfStrings = ["one", "two", "three"]



if allItemsMatch(stackOfStrings, arrayOfStrings) {

print("All items match.")

} else {

print("Not all items match.")

}

// Prints "All items match."
NHN	NEXT	Eunjoo	Im
참고

자료
https://itun.es/kr/jEUH0.l
Apple Inc. The Swift Programming Language (Swift 3.0.1)
NHN	NEXT	Eunjoo	Im
Thank	
You

Weitere ähnliche Inhalte

Was ist angesagt?

0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
Sung-hoon Ma
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
ETRIBE_STG
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선
daewon jeong
 
Do swift: Swift 무작정 해보기
Do swift: Swift 무작정 해보기Do swift: Swift 무작정 해보기
Do swift: Swift 무작정 해보기
YoonBong Steve Kim
 

Was ist angesagt? (19)

0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기
 
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
 
Java lambda
Java lambdaJava lambda
Java lambda
 
6 swift 고급함수
6 swift 고급함수6 swift 고급함수
6 swift 고급함수
 
Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린
 
파이썬+함수 데코레이터+이해하기 20160229
파이썬+함수 데코레이터+이해하기 20160229파이썬+함수 데코레이터+이해하기 20160229
파이썬+함수 데코레이터+이해하기 20160229
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형
 
Jupyter notebook 이해하기
Jupyter notebook 이해하기 Jupyter notebook 이해하기
Jupyter notebook 이해하기
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초
 
Javascript
JavascriptJavascript
Javascript
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선
 
Java8 & Lambda
Java8 & LambdaJava8 & Lambda
Java8 & Lambda
 
강의자료4
강의자료4강의자료4
강의자료4
 
JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
Do swift: Swift 무작정 해보기
Do swift: Swift 무작정 해보기Do swift: Swift 무작정 해보기
Do swift: Swift 무작정 해보기
 

Ähnlich wie Swift3 generic

Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3
david nc
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
SeongHyun Ahn
 
[2011 05 21] 4장 제어
[2011 05 21] 4장 제어[2011 05 21] 4장 제어
[2011 05 21] 4장 제어
Jong Pil Won
 
[2011 05 21] 4장 제어
[2011 05 21] 4장 제어[2011 05 21] 4장 제어
[2011 05 21] 4장 제어
Jong Pil Won
 
Linq to object using c#
Linq to object using c#Linq to object using c#
Linq to object using c#
병걸 윤
 
[2011 05 21] 4장 제어
[2011 05 21] 4장 제어[2011 05 21] 4장 제어
[2011 05 21] 4장 제어
Jong Pil Won
 

Ähnlich wie Swift3 generic (20)

Swift 0x17 generics
Swift 0x17 genericsSwift 0x17 generics
Swift 0x17 generics
 
[Swift] Generics
[Swift] Generics[Swift] Generics
[Swift] Generics
 
Collection framework
Collection frameworkCollection framework
Collection framework
 
Light Tutorial Python
Light Tutorial PythonLight Tutorial Python
Light Tutorial Python
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3
 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
 
[Swift] Functions
[Swift] Functions[Swift] Functions
[Swift] Functions
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
 
STL study (skyLab)
STL study (skyLab)STL study (skyLab)
STL study (skyLab)
 
[2011 05 21] 4장 제어
[2011 05 21] 4장 제어[2011 05 21] 4장 제어
[2011 05 21] 4장 제어
 
[2011 05 21] 4장 제어
[2011 05 21] 4장 제어[2011 05 21] 4장 제어
[2011 05 21] 4장 제어
 
Linq to object using c#
Linq to object using c#Linq to object using c#
Linq to object using c#
 
Java advancd ed10
Java advancd ed10Java advancd ed10
Java advancd ed10
 
파이썬 심화
파이썬 심화파이썬 심화
파이썬 심화
 
[2011 05 21] 4장 제어
[2011 05 21] 4장 제어[2011 05 21] 4장 제어
[2011 05 21] 4장 제어
 
파이썬 크롤링 모듈
파이썬 크롤링 모듈파이썬 크롤링 모듈
파이썬 크롤링 모듈
 
[Swift] Data Structure - Stack
[Swift] Data Structure - Stack[Swift] Data Structure - Stack
[Swift] Data Structure - Stack
 
Kotlin with fp
Kotlin with fpKotlin with fp
Kotlin with fp
 

Swift3 generic

  • 2. NHN NEXT Eunjoo Im Generic 소개 ▪ Generic code를 사용하면 타입을 제한하지 않으므로 중복 감소 및 의도의 명시적 표현 가능 ▪ Swift의 중요 기능 중 하나로 많은 표준 라이브러리가 사용 ▪ Int, String 등 컬렉션에 들어가는 타입을 명시하지 않고 어 느 타입이나 담을 수 있음 출처: Apple Inc. The Swift Programming Language (Swift 3.0.1) func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA } func swapTwoValues<T>(_ a: inout T, _ b: inout T) { let temporaryA = a a = b b = temporaryA } var someString = "hello" var anotherString = "world" swapTwoValues(&someString, &anotherString) 일반 function Generic function type parameter ex) Dictionary<Key, Value>
  • 3. NHN NEXT Eunjoo Im Generic Type ▪ Array, Dictionary에 타입 제한 없이 넣을 수 있던 것처럼, 커스텀 class, structure, enumeration이 어떤 타입이라 도 사용할 수 있도록 할 수 있음 출처: Apple Inc. The Swift Programming Language (Swift 3.0.1) struct IntStack { var items = [Int]() mutating func push(_ item: Int) { items.append(item) } mutating func pop() -> Int { return items.removeLast() } } struct Stack<Element> { var items = [Element]() mutating func push(_ item: Element) { items.append(item) } mutating func pop() -> Element { return items.removeLast() } } 일반 stack Generic function
  • 4. NHN NEXT Eunjoo Im Generic Type ▪ Array, Dictionary에 타입 제한 없이 넣을 수 있던 것처럼, 커스텀 class, structure, enumeration이 어떤 타입이라 도 사용할 수 있도록 할 수 있음 출처: Apple Inc. The Swift Programming Language (Swift 3.0.1) struct IntStack { var items = [Int]() mutating func push(_ item: Int) { items.append(item) } mutating func pop() -> Int { return items.removeLast() } } struct Stack<Element> { var items = [Element]() mutating func push(_ item: Element) { items.append(item) } mutating func pop() -> Element { return items.removeLast() } } var stackOfStrings = Stack<String>() stackOfStrings.push("one") stackOfStrings.push("two") 일반 stack Generic stack
  • 5. NHN NEXT Eunjoo Im Generic Type 확장 ▪ 확장 시 type parameter를 정의할 필요 없이 기존 타입 정의를 그대로 사용할 수 있음 출처: Apple Inc. The Swift Programming Language (Swift 3.0.1) struct Stack<Element> { var items = [Element]() mutating func push(_ item: Element) { items.append(item) } mutating func pop() -> Element { return items.removeLast() } } // topItem이라는 읽기 전용 computed property 추가 extension Stack { var topItem: Element? { return items.isEmpty ? nil : items[items.count - 1] } } 기존 generic stack extension generic stack 기존 type parameter를 사용
  • 6. NHN NEXT Eunjoo Im Type 제약 ▪ 모든 type을 받지 않고 특정 조건을 만족하는 타입만 사용 하도록 할 수 있음 ▪ Swift Dictionary의 경우 Hashable 프로토콜을 따르는 타 입만 key로 사용 가능 (String, Int, Double, Bool) 출처: Apple Inc. The Swift Programming Language (Swift 3.0.1) func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) { // }type 제약 문법 func findIndex(ofString valueToFind: String, in array: [String]) -> Int? { for (index, value) in array.enumerated() { if value == valueToFind { return index } } return nil } func findIndex<T: Equatable>(of valueToFind: T, in array:[T]) -> Int? { for (index, value) in array.enumerated() { if value == valueToFind { return index } } return nil } T: Equatable Equatable protocol을 따르는 T 안넣으면 == 조건문을 지원하지 않는 타입이 있으므로 에러 String array에서 특정 String 탐색 array에서 특정 T 탐색
  • 7. NHN NEXT Eunjoo Im 연관 Type ▪ protocol의 일부로 사용될 type의 이름을 정의 ▪ protocol 정의 시 함께 정의하면 편리함 ▪ 실제 protocol이 적용될 때 사용됨 ▪ associatedtype 키워드 사용 출처: Apple Inc. The Swift Programming Language (Swift 3.0.1) // Container 프로토콜에서 ItemType이라는 연관 타입 정의 protocol Container { associatedtype ItemType mutating func append(_ item: ItemType) var count: Int { get } subscript(i: Int) -> ItemType { get } } append(_:) 메서드로
 container에
 새 아이템 추가 가능 Int 값을 반환하는 count 프로퍼티로 아이템 수 계산 가능 Int 인덱스 subsctipt를 통해 아이템에 접근 가능
  • 8. NHN NEXT Eunjoo Im 출처: Apple Inc. The Swift Programming Language (Swift 3.0.1) 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<Element>: Container { // original Stack<Element> implementation var items = [Element]() mutating func push(_ item: Element) { items.append(item) } mutating func pop() -> Element { return items.removeLast() } // conformance to the Container protocol mutating func append(_ item: Element) { self.push(item) } var count: Int { return items.count } subscript(i: Int) -> Element { return items[i] } } Container 프로토콜을 따르는 IntStack Container 프로토콜을 따르는 generic Stack ItemType을 Int로 변환 append(_:) 메서드가 Element를 사용하므로
 자동으로 타입 추론
  • 9. NHN NEXT Eunjoo Im Generic Where문 ▪ generic where문을 정의하여 연관 타입의 요구 사항을 정 의할 수 있음 ▪ 연관 타입이 따라야할 프로토콜을 지정하거나, 특정 type parameter와 일치하도록 지정할 수 있음 출처: Apple Inc. The Swift Programming Language (Swift 3.0.1) // 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 } func allItemsMatch<C1: Container, C2: Container> (_ someContainer: C1, _ anotherContainer: C2) - > Bool where C1.ItemType == C2.ItemType,
 C1.ItemType: Equatable { // Check that both containers
 contain the same number of items. if someContainer.count !=
 anotherContainer.count { return false } C1과 C2는 Container 프로토콜을 따름 C2의 ItemType은 Equatable을 따름 C1과 C2의 ItemType은 동일
  • 10. NHN NEXT Eunjoo Im Generic Where문 출처: Apple Inc. The Swift Programming Language (Swift 3.0.1) var stackOfStrings = Stack<String>() stackOfStrings.push("one") stackOfStrings.push("two") stackOfStrings.push("three") var arrayOfStrings = ["one", "two", "three"] if allItemsMatch(stackOfStrings, arrayOfStrings) { print("All items match.") } else { print("Not all items match.") } // Prints "All items match."