본문 바로가기

분류 전체보기

(124)
Generics - Type Parameters swapTwoValues(:) 예제에서 임의의 타입 T는 타입 파라미터의 예입니다. 타입 파라미터는 꺾쇠 괄호 (예: ) 사이에 작성하고 함수명 바로 뒤에 작성되어 임의의 타입을 지정합니다. 타입 파라미터를 지정하면 함수의 파라미터 타입(swrapTwoValue(:) 함수의 a, b와 같이)을 정의하기 위해 사용하거나 함수의 반환 타입이나 함수의 본문 내에서 타입 주석으로 사용할 수 있습니다. 각각의 경우 타입 파라미터는 함수가 호출될 때마다 실제 타입으로 대체됩니다. (위 예제에서 swapTwoValues(:) 함수는 첫번째 불릴때 Int로 유추되고, 두번째 불릴떄 String으로 유추됩니다.) 콤마로 구분된 꺾쇠 괄호 안에 여러개의 타입 파라미터를 작성하여 하나 이상의 타입 파라미터도 제공 가능합니다..
Generics - Generic Functions Generics 제네릭 코드(Generic code)를 사용하면 정의한 요구 사항에 따라 모든 유형에서 동작할 수 있는 유연하고 재사용 가능한 함수 및 타입을 작성할 수 있습니다. 중복을 피하고 의도를 명확하고 추상적으로 표현하는 코드를 작성할 수 있습니다. 제네릭은 Swift의 가장 강력한 기능 중 하나이며 Swift 표준 라이브러리의 대부분은 제네릭 코드로 구축됩니다. 사실 Language Guide 전체에 걸쳐서 제네릭을 사용하고 있습니다. 예를 들어 Swift의 Array나 Dictionary 타입은 모드 제네릭 컬렉션입니다. Int 값을 보유하는 배열이나 String 값을 보유하는 배열 또는 Swift의 다른 타입의 배열을 만들 수 있습니다. 마찬가지로 특정한 타입의 값을 저장하는 Diction..
Protocol Extensions (프로토콜 확장) 프로토콜은 준수하는 타입에 제공하기 위해 메서드, 초기화구문, 서브스크립트, 계산 프로퍼티 구현이 확장될 수 있습니다. 이것을 각 타입의 개별 적합성이나 전역 변수가 아니라 프로토콜의 자체에 동작을 정의할 수 있습니다. 예를들어 RandomNumerGenerator 프로토콜은 임의의 Bool 값을 반환하기 위해 필요한 random() 메서드의 결과를 사용하는 randomBool() 메서드를 제공하기 위해서 확장될 수 있습니다. 프로토콜의 확장을 생성함으로써 모든 준수하는 타입은 추가 수정없이 메서드 구현을 자동으로 얻습니다. 프로토콜 확장은 준수하는 타입에 구현을 추가할 수 있지만 프로토콜을 확장하거나 다른 프로토콜을 상속할 수 없습니다. 프로토콜 상속은 항상 선언 할때 지정됩니다. Providing D..
Optional Protocol Requirements (옵셔널 프로토콜 요구사항) 프로토콜에 옵셔널 요구사항도 정의할 수 있습니다. 이 요구사항은 준수하는 타입이 되기위해서 꼭 구현할 필요가 없습니다. 옵셔널 요구사항으로 정의하기 위해서 optional 수식어를 앞에 붙여서 표시합니다. 프로토콜과 옵셔널 요구사항 앞에 @objc 수식어가 붙고 objective-c와 상호운용 할 수 있습니다. @objc 프로토콜은 클래스에서만 사용할 수 있고, 구조체나 열거형에서는 사용할 수 없습니다. 옵셔널 요구사항에서 메서드나 프로퍼티를 사용할때는 자동으로 옵셔널 타입이 됩니다. 예를 들어 (Int) → String 타입의 메서드는 자동으로 ((Int) → String)?이 됩니다. 전체 함수 타입은 메서드의 반환 값이 아니라 옵셔널로 래핑됩니다. 옵셔널 프로토콜 요구사항은 프로토콜을 준수하는 타입..
Checking for Protocol Conformance (프로토콜 준수 검사) is 나 as 연산자를 이용해서 프로토콜 준수에 대한 체크나 특정 타입으로의 캐스팅을 할 수 있습니다. 이건 타입 캐스팅에서 설명 is 연산자는 인스턴스가 프로토콜을 준수하면 true 아니면 false를 반환 다운 캐스트 연산자인 as?는 프로토콜 타입의 옵셔널 값을 반환, 준수하지 않으면 nil을 반환 다운 캐스트 연산자인 as!는 강제로 다운 캐스팅 하고 실패할 경우 런타임 에러가 발생 HasArea라는 프로토콜을 하나 정의합니다. HasArea는 are 라는 Double 타입 gettable 프로퍼티을 단일 요구사항으로 가집니다. HasArea 프로토콜을 준수하는 Circle 과 Country 두개의 클래스를 선언합니다. 두 클래스 모두 HasArea의 요구사항을 준수합니다. 이번에는 HasArea..
Protocol Composition (프로토콜 혼합) 프로토콜 혼합을 사용해서 여러 프로토콜을 단일 요구사항으로 결합할 수 있습니다. 동시에 여러개의 요구사항을 준수하는 타입을 요구할때 유용하게 사용할 수 있습니다. 프로토콜 혼합은 & 로 결합해서 쓸 수 있습니다. 예를들어서 SomeProtocol & AnotherProtocol 형식 프로토콜 혼합은 프로토콜 리스트 외에도 필요한 수퍼 클래스를 지정하는 데 사용할 수 있는 하나의 클래스 유형이 포함될 수 있습니다. 클린 아키텍처를 구성할때 CoordinatorDependencies 들을 묶어서 사용할때 많이 사용했는데 모르는 사이 프로토콜 혼합을 자주 사용하고 있었습니다. 다음은 Named 와 Aged 라는 두 프로토콜을 함수 파라미터에 단일 프로토콜 요구사항으로 결합한 예제 Named 프로토콜은 name..
Class-Only Protocol 프로토콜 선언 시 상속 리스트에 AnyObject를 추가하면 클래스에서만 채택하게 할 수 있습니다. SomeClassOnlyProtocol은 클래스에서만 채택할 수 있고, 구조체나 열거형에서 채택시 컴파일 에러가 발생합니다. 예전에는 클래스 전용 프로토콜로 사용하기 위해서 상속 리스트에 class 라고 선언했었는데 찾아보니 Swift4 부터 AnyObject가 권장되는 것 같습니다. class를 사용 불가능한건 아닌 것 같고 depreacted 경고가 발생하니까 AnyObject를 사용하는 걸로 Note 프로토콜을 준수하는 타입이 값 타입(Value Types)가 아니라 참조 타입(Reference Types) 체계인 경우 클래스 전용 프로토콜을 사용합니다.
Protocol Inheritance 프로토콜 상속 프로토콜은 하나 이상의 프로토콜을 상속 할 수 있고 상속한 요구사항에 요구사항을 더 추가할 수도 있습니다. 상속하는 방법은 클래스의 상속과 비슷하지만 콤마를 통해 여러개의 상속을 리스트화 할 수 있습니다. 다음은 TextRepresentable 프로토콜을 상속하는 프로토콜 PrettyTextRepresentable 프로토콜을 채택하려면 TextRepresentable 프로토콜과 PrettyTextRepresentable 프로토콜의 요구조건을 모두 충족해야 합니다. 확장을 통해 SnakesAndLadders에 PrettyTextRepresentable 프로토콜을 채택 PrettyTextRepresentable 프로토콜을 준수하면 TextRepresentable 프로토콜도 준수하기 때문에 te..