목차

9. Generics

Array와 Dictionary는 generic collection

generic 함수 또는 타입을 만들기 위해서 < > 대괄호angle brackets 안에 이름을 쓴다.

func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {
    var result = [Item]()  // Item타입으로 하는 배열
    for _ in 0..<numberOfTimes {
        result.append(item)
    }
    return result
}
makeArray(repeating: "knock", numberOfTimes: 4)

*Item: 함수 makeArray가 호출될 때마다 타입이 결정된다!

functions, methods, classes, enumerations, structures 모두 generic타입으로 만들 수 있다.

// Reimplement the Swift standard library's optional type
enum OptionalValue<Wrapped> {
    case none
    case some(Wrapped)
}
var possibleInteger: OptionalValue<Int> = .none
possibleInteger = .some(100)

??? 무슨 말이지.. optional이니까 없거나(none) 있거나(some)..

where

요구사항의 리스트를 쓰기 전에 where을 써라. 예를 들어, 프로토콜을 심기 위해, 두개의 타입이 같도록하기 위해,클래스가 특정 슈퍼클래스를 가져야한다고 하기 위해

func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Bool
    // Equatable: protocol, 값의 동일성을 비교할 수 있는 타입(Int, String, Double, Bool, Float, ...)
where T.Element: Equatable, T.Element == U.Element
{
    for lhsItem in lhs {
        for rhsItem in rhs {
            if lhsItem == rhsItem {
                return true
            }
        }
    }
    return false
}

code

}

*<T: Equable> = <T> ... where T: Equatable.

**experiment**

anyCommenElements(_: _:) 함수를 수정: 공통의 요소들을 가진 하나의 배열을 리턴하는 함수로

func CommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Array<T.Element>
where T.Element: Equatable, T.Element == U.Element
{
    var commonArray = Array<T.Element>()
    for lhsItem in lhs {
        for rhsItem in rhs {
            if lhsItem == rhsItem {
                commonArray.append(lhsItem)
            }
        }
    }
    return commonArray
}