타입 캐스팅은 인스턴스의 타입을 확인하거나 슈퍼클래스나 서브클래스의 인스턴스를 그 부모-자식 관계에 있는 다른 클래스의 인스턴스로 취급하기 위한 방법입니다. 스위프트의 타입캐스팅은 is 와 as 로 구현할 수 있습니다. 타입 캐스팅을 통해 프로토콜을 준수하는지도 확인할 수 있습니다. Defining a Class Hierarchy for Type Casting 같은 hierarchy(상속의 가계도라고 생각하면 됨)와 함께 타입 캐스팅을 사용하여 특정 클래스 인스턴스의 유형을 확인하고 해당 인스턴스를 동일한 계층 내의 다른 클래스로 캐스팅할 수 있습니다. class MediaItem { var name: String init(name: String) { self.name = name } } ////////..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/IjGkQ/btqNQwDhyb0/EkInZNyJBWia1IbMrzCtx0/img.png)
에러 핸들링은 프로그램 속 에러 상태에 반응하고 복구하기 위한 과정입니다. 스위프트는 런타임 에러를 커버할 수 있는 자원을 제공합니다. 몇몇 연산은 완벽한 결과문 또는 쓸만한 아웃풋을 항상 준다는 보장을 할 수 없지만 연산이 실패했을 때 적절하게 반응하기 위해 어떤 문제로 실패하게 되었는지 이해하는 것은 유용합니다. Representing and Throwing Errors 스위프트에서 에러는 Error 프로토콜을 준수하는 타입의 값으로 표현됩니다. 이 프로토콜은 이 타입이 에러 핸들링에 사용될 수 있다는 것을 나타냅니다. 열거형은 비슷한 에러 컨디션을 그룹화하기에 적합합니다. enum VendingMachineError: Error { case invalidSelection case insufficie..
옵셔널 체이닝은 프로퍼티, 메소드, 서브스크립트들에게 현재 nil 값을 가지고 있는 옵셔널 타입인지 묻는 과정입니다. 만약 값이 nil이라면, 프로퍼티, 메소드. 서브스크립트는 nil을 반환합니다. 여러개의 옵셔널도 체인처럼 차근차근 값이 옵셔널인지 질문해 나아갈 수 있습니다.(아래에서 자세히 설명) 그리고 체인은 만약에 체인에 연결된 값 중 하나라도 nil이 있다면 실패합니다. 강제 언래핑의 대안인 옵셔널 체이닝 nil 값이 아닌 정상적인 값이 들어가있을때를 기대하고 프로퍼티나 메소드 혹은 서브스크립트를 호출할 때 옵셔널 값 앞에 ?를 붙임으로서 옵셔널 체이닝 시킵니다. 이것은 !를 붙이는 것과 매우 유사한데. 옵셔널 값이 언래핑되어진 이후 가장 주요한 차이점은 옵셔널 체이닝은 옵셔널이 nil일 경우 ..
클래스는 메소드, 프로퍼티 그리고 다른 특성들을 다른 클래스로부터 상속 받을 수 있습니다. 한 클래스가 다른 클래스를 상속받을 때, 상속 받은 클래스는 subclass 라고 불리며, 상속해준 클래스를 superclass 라고 합니다. 상속은 스위프트의 다른 타입들과 클래스를 구별지는 기본적인 기능입니다. 스위프트의 클래스는 superclass의 메소드, 프로퍼티 그리고 서브스크립트에 접근 및 호출이 가능하며, 또한 자신만의 오버로딩된 버전 또한 수정 및 재정의가 가능합니다. 클래스는 또한 값이 변경되었을 때 알림을 받기 위해서 상속된 프로퍼티에 프로퍼티 옵저버를 추가할 수 있습니다. 원본 프토퍼티가 저장, 연산.프로퍼티로 정의되었음에도 불구하고 말이죠. Base Class 정의하기 다른 클래스로부터 상속..
클래스, 구조체, 열거형은 서브스크립트를 정의할 수 있습니다. 서브스크립트는 Collection, list 또는 sequence의 요소를 단축어로 쉽게 접근 가능합니다. 서브스크립트를 이용해서 별도의 값 지정 및 검색하는 메소드 없이도 값을 지정하고 검색할 수 있습니다. 예를 들어 Array의 인스턴스인 sommArray[index]가 있다고 가정할 때 인덱스값을 통해 요소에 접근하는 것처럼 말입니다. 같은 타입에 여러개의 서브스크립트를 정의하면 사용하기 적절한 오버로딩된 서브스크립트가 상황에 맞게 선택됩니다. 서브스크립트는 1차원에 머물러있지 않습니다. 또한 당신의 커스텀 타입의 수요에 따라 적절한 여러개의 인풋 파라미터값이 있는 서브스크립트를 정의할 수 있습니다. (공식문서를 읽을 때마다 드는 생각이..
메소드는 클래스, 구조체 그리고 열거형 타입과 연관된 함수 입니다. 앞서 언급한 타입들은 인스턴스 메소드와 타입 메소드를 정의할 수 있습니다. (타입 메소드는 Objective-C의 클래스 메소드와 유사합니다.) swift에서 구조체와 열거형도 메소드를 정의가능하다는 사실은 C나 Objective-C와는 큰 차이점입니다. Objective-C에선 클래스는 메소드를 정의할 수 있는 유일한 타입입니다. 스위프트에서는, 유연성있게 메소드를 정의하기 위해 클래스, 구조체, 열거형을 선택할 수 있습니다. 인스턴스 메소드 인스턴스 메소드는 특정 클래스, 구조체, 열거형의 인스턴스에 속하는 함수입니다. 인스턴스 메소드는 인스턴스의 기능적인 부분을 돕거나 인스턴스 프로퍼티들을 수정하고 접근할 방법을 제공합니다. 인스턴..
프로퍼티는 특정 클래스, 구조체 또는 열거형의 값과 연관되어 있습니다. 저장 프로퍼티는 인스턴스 값을 상수나 변수에 저장하고 반면에 연산 프로퍼티는 값을 저장하기 보단 값을 연산한다. 연산 프로퍼티는 클래스, 구조체 그리고 열거형에 사용할 수 있고, 저장 프로퍼티는 열거형에서는 사용할 수 없다. 저장 및 연산 프로퍼티는 각 타입의 인스턴스와 일반적으로 연관되어 있습니다. 그러나 프로퍼티는 타입 그자체와도 연관될 수 있습니다. 예를 들어 타입 프로퍼티로 알려진 프로퍼티 등등.. 게다가 프로퍼티 옵서버를 정의하여 프로퍼티의 값이 바뀌는 것을 모니터링 할 수 있습니다. 프로퍼티 옵서버는 저장 프로퍼티에 추가 가능합니다, 또한 부모 클래스로 부터 상속받은 프로퍼티에게도 가능합니다. 저장 프로퍼티 struct F..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/zvHkB/btqMmqepNhB/gQV9xjclFeQXSAtKUJarO1/img.png)
정의 문법 ,구조체와 클래스는 코드를 블럭으로 쌓아가는 유연한 구조를 만드는 일반적인 목적입니다. 구조체와 클래스의 기능을 추가하기 위해 변수, 상수, 함수를 만들 때와 동일한 문법을 사용하며 프로퍼티와 메소드를 정의할 수 있습니다. 다른 언어들과는 다르게 스위프트는 커스텀 구조체와 클래스를 만들기 위해 별도의 분리된 인터페이스나 파일들을 만들 필요가 없습니다. 스위프트에선 한 파일에 클래스나 구조체를 정의하면 자동적으로 외부 인터페이스가 외부에서도 사용할 수 있습니다. 구조체와 클래스를 비교하면 구조체와 클래스 둘 다 가능한 것들 값을 저장할 프로퍼티 정의 가능 기능을 제공할 메소드 정의 가능 서브스크립트 정의 가능(이건 차후에 나올 서브스크립트 챕터에 자세히) 생성자 정의 가능 기본적인 구현을 넘어서..
eunmeration은 관련있는 값들을 그룹지어 주는 타입이고 코드를 타입적으로 안전하게 값들을 다룰 수 있도록 돕습니다. 만약 당신이 C에 익숙하다면 C의 enumeration은 이름과 관련된 정수 값을 세트로 가지고 있다는 것을 알고 있을 것입니다. swift의 enumeration은 좀 더 유연성 있게 되었습니다. 그리고 enumeration의 어떤 case도 값을 제공할 필요가 없습니다. 만약 raw value 라고 불리는 한 값이 각각의 enumeration case 값에 제공된다면, 그 값은 string, character 또는 어떤 정수, 실수값이든 가능합니다. swift의 enumeration은 그 자체로 first-class 타입입니다.( 정확히 무슨 의미인지 모르겠는데 대강 클래스 타입..
클로저는 독립된 기능 블록으로 코드 안에서 전달되고 사용될 수 있습니다. 스위프트의 클로저는 C와 Objective-C의 블록이나 다른 프로그래밍 언어의 람다식과 유사합니다. 클로저는 정의된 문장안에서 어떤 상수나 변수도 저장 및 챕쳐가 가능합니다. 이것은 변수나 상수를 "캡쳐링한다"라고 알려져 있으며, 스위프트는 당신을 위한 메모리 관리 캡쳐링을 다룰 수 있습니다. 전에 Function에서 다룬 Global, nested function은 사실 클로저의 특별한 케이스입니다. 클로저는 세가지 형태중 하나를 가질 수 있습니다. Global function은 어떤 값도 캡쳐하지 않고 이름을 가지고 있는 클로저 입니다. Nested function은 function 내부의 값을 캡쳐할 수 있고 이름을 가지고 ..