1. generic
c++의 템플릿 개념
2가지 방식으로 존재
c++ : 스위프트와 같은 방식, 함수 여러개 만들어야 한다.
java : 객체 생성, 함수는 1개로 가능, 성능저하가 있다.
2. 샘플코드
/*
func swap(inout a : Int, inout _ b : Int )
{
let temp = a
a = b
b = temp
}
*/
// 1. 기본 모양 (T하나만 있으면 같은 타입을 넘겨야함)
func Swap<T>(inout a : T, inout _ b : T )
{
let temp = a
a = b
b = temp
}
var x = "st"
var y = "gs"
Swap(&x,&y) // 실제 주소를 보내는건 아니다. inout 방식이면 &를 붙인다. 20, 10으로 바뀜
print(x,y)
// 2. Generic을 2개 이상 사용하는 경우
func foo<T1, T2> ( a: T1, _ b : T2)
{
showType(a)
showType(b)
print(a, b)
}
var a = "ss"
var b = 3
foo(a,b)
// 형식 제약, T타입은 비교가능해야함(c++에선 컨셉), 모든 Templete은 비교가능해야한다.
// 아래 함수는 T 타입이 == 가능한 경우만 동작한다.
// c++ : == 가능한 타입을 전달하면 에러가 없고, == 불가능한 타입 사용시만 에러, <T:Where>
// java, c#, swift : T가 == 가능한 타입이어야 한다고 표시 해야 한다.
// swift : <T:프로토콜 이름>
func compare<T : Equatable> (a : T, _ b : T) -> Bool
{
return a == b
}
var x1 = 10
var y1 = 10
compare(x1, y1)
// specialization
// 혹시 더블로 왔을 때만 해당 함수 씀, 오버로딩 처럼 보이지만 이건 specialization
func goo<T> (arg : T)
{
print("T")
print(arg)
}
func goo (arg : Double)
{
print("double")
print(arg)
}
func goo<T> (arg : Array<T>)
{
print("array")
print(arg)
}
goo(3)
goo(3.4)
goo([1,2,3,])
// generic 클래스
//class Stack<T>
//{
// var buff : Array<T> = []
//// var idx : Int = 0
// func push(a :T) {
// buff.append(a)
// }
// func pop() -> T {
// return buff.removeLast()
// }
//}
//var stk = Stack<Int>()
//stk.push(10)
//stk.push(20)
//
//print (stk.pop())
// 동일 타입의 컨테이너 크기를 비교하는 함수
protocol ContainerProtocol
{
func size() ->Int
associatedtype valueType // templete 만들때 사용한다.
}
class Stack<T> : ContainerProtocol
{
var buff : Array<T> = []
// var idx : Int = 0
func push(a :T) {
buff.append(a)
}
func pop() -> T {
return buff.removeLast()
}
typealias valueType = T
func size() -> Int {
return buff.count
}
}
func sizecompare<T1:ContainerProtocol,
T2:ContainerProtocol
where T1.valueType == T2.valueType> (a : T1, _ b : T2) -> Bool
{
return a.size() == b.size()
}
// 명시적 추론,
//func hoo<T> ()//a:T) 인자없는 generic 안됌
//{
//
//}
//var x = 0
//hoo(x) // 컴파일러가 T를 Int로 추론 - 암시적 추론
//hoo<Int>(x) // 사용자가 T의 타입을 지정 - 명시적 추론 swift는 에러, c++가능
'교육 > Swift' 카테고리의 다른 글
[swift] guard (0) | 2016.08.22 |
---|---|
[swift] exception (0) | 2016.08.22 |
[swift] operator overloading (0) | 2016.08.08 |
[swift] protocol (0) | 2016.08.08 |
[swift] casting (0) | 2016.08.08 |