본문 바로가기

교육/Swift

[swift] generic

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