swapTwoInts
를 선언하면 입력한 두 Int값이 변경된 것을 확인할 수 있습니다.NOTE 위 세 함수에서 모두 a와 b의 타입이 동일해야 합니다. 만약 a와 b가 동일하지 않다면 두 값을 바꿔치기 할 수 없습니다. Swift는 타입-세이프 언어여서String
과Double
를 바꾸려고 하면 컴파일 에러가 발생합니다.
NOTE 제네릭의 예로 생성한swapTwoValues
함수는 Swift에서swap
기본적으로 제공합니다.
항상 파라미터 이름은 T나 MyTypeParameter와 같이 대문자 카멜 케이스로 이름 짓습니다. 대문자로 된 이름은 값(value)이 아니라 타입(type)을 의미합니다.
NOTE 스택은UINavigationController
에서 사용하는 자료구조입니다. 네비게이션 계층에 뷰 컨트롤러를pushViewController
와popViewController
를 이용해 추가하거나 뺄 수 있습니다.
IntStack
의 구현은 다음과 같습니다.String
값이 들어가게 됩니다.pop()
함수를 실행합니다.Element
라는 파라미터를 사용합니다.topItem
프로퍼티에 접근합니다.hashable
이라는 프로토콜을 반드지 따라야 합니다. 그렇지 않으면 key로 value에 접근했을 때 적절한 value를 얻지 못할 수 있습니다. 이와 같이 특정 타입이 반드시 어떤 프로토콜을 따라야 하는 경우가 있습니다. 네릭에서도 이런 경우가 필요할 수 있습니다. 제네릭에서는 특정 클래스를 상속하거나 특정 프로토콜을 따르거나 합성하도록 명시할 수 있습니다.findIndex
함수를 선언합니다.strings
배열에서 찾기 원하는 문자열 llama
의 인덱스 위치를 찾는 것이 잘 동작함을 확인할 수 있습니다.value == valueToFind
의 코드에서 두 값을 비교하게 되는데 두 값을 비교하는 경우에는 즉, ==
등호 메소드를 사용하기 위해서는 두 값 혹은 객체가 반드시 Equatable
프로토콜을 따라야 하기 때문입니다. 이 문제를 해결하기 위해 T는 Equatable
프로토콜을 따른다고 표시합니다. 타입 플레이스 홀더에 <T: Equatable>
같이 적어줍니다. 이것으로 T가 Equatable
프로토콜을 따른 다는 것을 알려줍니다.associatedtype
를 사용할 수 있습니다. 이렇게 지정하면 Item은 어떤 타입도 될 수 있습니다.append
, count
, subscript
가 모두 정의돼 있기 때문입니다.true
를 반환하는 allItemsMatch
함수를 구현하면 다음과 같습니다.true
를 얻게 됩니다. 다음은 다른 타입의 Container, 하나는 스택, 다른 하나는 배열을 내용을 allItemsMatch
함수로 비교한 결과 입니다.Equatable
프로토콜을 따라야 한다고 제한을 부여한 코드입니다.Equatable
프로토콜을 따르므로 true
에 해당하는 분기가 실행됩니다.Equatable
을 따르지 않는 Stack에서 익스텐션에 선언된 함수 isTop을 실행하면 에러가 발생하는 것을 확인할 수 있습니다.Equatable
프로토콜을 따르는 제약을 추가한 예제입니다. startsWith
함수의 인자인 Item은 Container의 특정 아이템이 입력한 Item으로 시작하는지 비교하기 위해서는 Container의 첫 아이템이 입력한 Item과 같은지 비교해야 하기 때문에 Equatable
프로토콜을 따라야 합니다.startsWith
를 실행합니다. Int값인 42는 Equatable
프로토콜을 따르므로 startsWith
이 실행되고 42는 배열의 첫 값인 9와 같지 않으므로 같지 않다는 분기가 실행됩니다.[1260.0, 1200.0, 98.6, 37.0]
이 Double형이기 때문에 익스텐션에서 구현된 average()를 사용할 수 있습니다.Indices.Iterator.Element
가 Int 형이어야 한다는 조건을 건 예입니다.