[이전 포스트]프로그래밍 언어 Swift 기초 다지기 1
클로져
실행 가능한 코드 블록입니다. 일급 객체로 전달인자나 변수 또는 상수에 저장할 수 있습니다.
함수를 이름이 있는 클로져라고도 부릅니다.
후행 클로져
클로져가 함수의 마지막 전달인자라면 마지막 매개변수를 생략한 후 외부에 구현할 수 있습니다.
caculate 의 반환타입이 Int 인 점이 명확하므로 반환타입을 생략해도 문제가 없습니다.
그러나 in 키워드는 절대 생략할 수 없습니다.
단축 인자 클로져
클로져의 매개변수 이름이 굳이 불필요하다면 단축 인자 이름을 사용할 수 있습니다.
후행 클로져와 함께 사용할 수도 있습니다.
클로져가 반환한 값이 있다면 클로져의 마지막 줄의 결과값은 암시적 반환 값으로 취급됩니다.
한 줄로 쓸 수도 있습니다.
프로퍼티
프로퍼티는 구조체, 열거형, 클래스 내부에 선언합니다. 그 역할에 따라 저장 프로퍼티, 연산 프로퍼티, 인스턴스 프로퍼티, 타입 프로퍼티가 있습니다.
열거형 내부에는 연산 프로퍼티만 구현할 수 있으며 이 연산 프로퍼티는 var 로만 선언할 수 있습니다.
get 블록을 통해 읽기, set 블록을 통해 쓰기를 구현할 수 있습니다.
프로퍼티 감시자
프로퍼티 감시자란 프로퍼티 값이 변경될 때 특정한 동작을 수행하도록 하는 기능입니다. 값이 변경되기 직전에 willset 블럭이 수행되고, 값이 변경된 직후 didset 블록이 수행됩니다. 다만 연산프로퍼티에서는 사용될 수 없습니다.
상속
클래스, 또는 프로토콜만 상속할 수 있습니다. 다만 다중 상속은 불가능합니다.
상속을 원하지 않는 프로퍼티의 경우 static 이나 final 키워드를 앞에 붙이면 됩니다. 이 프로퍼티들은 재정의할 수 없습니다.
자식 클래스에서 부모 클래스의 프로퍼티를 호출하고 싶다면 super 와 프로퍼티이름을 . 으로 연결하면 됩니다.
인스턴스 생성자 (Initializer)
프로퍼티는 모두 기본값을 가져야 합니다. 만약 기본값을 할당하기 어려운 경우에는 이니셜라이져(Initializer) 라는 것을 사용하면 됩니다.
이니셜라이져가 옵셔널을 반환하도록 하여 nil 을 반환하도록 합니다.
인스턴스 소멸자 (Deinitializer)
인스턴스가 메모리에서 해제되는 시점에 호출됩니다. 클래스에만 구현할 수 있습니다.
옵셔널 체이닝
옵셔널의 내부의 내부의 … 내부로 옵셔널이 연결되어 있을 때 간단하게 사용할 수 있는 방법입니다. 조건문 여러개를 복잡하게 사용해야 하는 낭비를 없애줍니다.
만약 이 코드를 옵셔널 체이닝을 사용하지 않으려면 아래처럼 해야 합니다.
nil 병합 연산자 (??)
옵셔널 값이 nil 일 경우 nil 을 반환합니다.
타입 캐스팅
위 코드는 타입 캐스팅이 아닙니다. number1 에 맞는 Double 형 인스턴스를 새로 생성하는 형변환입니다.
is 키워드는 클래스의 인스턴스가 부모 혹은 자식 타입으로 사용할 수 있는지 확인하기 위해 사용됩니다.
업 캐스팅
as 키워드를 사용하면 인스턴스를 부모 클래스의 인스턴스로 사용할 수 있도록 합니다.
다운 캐스팅
as? 은 옵셔널 타입 캐스팅입니다. 조건에 부합하지 않는다면 nil 을 반환합니다.
as! 를 사용하면 강제로 타입 캐스팅을 할 수 있습니다. 조건에 부합하지 않는다면 런타임 에러입니다.
Assert
assert 는 배포하는 어플리케이션에 제외되는, 오직 디버깅을 위해서만 사용되는 키워드입니다. 조건 검증을 위해서 사용되며 만약 조건이 일치하지 않으면 어플리케이션이 종료됩니다.
Guard
guard 는 조건문처럼 특정 조건이 발생했을 때 동작하는 빠른 종료 키워드입니다.
변수를 밖에서도 사용할 수 있다는 점과, else 문 내에 return 이나 break 가 반드시 있어야 한다는 점이 if 문 과의 차이점입니다.
프로토콜
프로토콜(protocol) 이란 특정 기능을 수행하기 위해 메서드나 프로퍼티의 요구사항을 정의한 것을 말합니다.
구조체, 클래스, 열거형은 프로토콜을 채택하여(adopted) 프로토콜의 요구사항을 실제로 구현할 수 있습니다. 프로토콜의 요구사항을 모두 따르는 타입을 프로토콜을 준수한다(confirmed) 고 말합니다.
프로퍼티 요구는 항상 var 을 사용해야 합니다.
프로토콜은 상속할 수 있습니다. 그리고 클래스와는 다르게 다중 상속도 가능합니다.
클래스와 프로토콜 모두 상속받는 경우, 클래스를 먼저 써주고 그 다음에 프로토콜을 써주면 됩니다.
익스텐션 (Extension)
익스텐션(extension) 은 타입에 새로운 기능을 추가할 수 있는 Swift 의 놀랍고도 강력한 기능입니다. 즉 소스 코드를 알지 못하더라도 타입만 알고 있으면 새로운 기능을 추가할 수 있습니다. 외부 라이브러리나 프레임워크에 나만의 기능을 추가할 때 사용됩니다.
오류 처리
Swift 는 Error 프로토콜과 열거형을 통해 에러를 처리합니다. 오류를 처리하기 위해서는 throw 키워드를 사용하면 됩니다.
do-catch 구문을 활용해서 에러를 처리하는 방법도 있습니다.
try 키워드를 사용하는 경우도 있습니다. try 를 사용하게 되면 만약 오류가 발생할 경우 nil 값을 반환받을 수 있습니다.
고차함수
고차함수란 전달인자로 함수를 전달받거나 함수 실행의 결과를 함수로 반환하는 함수입니다. 고차함수로는 크게 map, filter, reduce 가 있습니다.
map 함수는 기존 데이터를 변형하여 새로운 컨테이너를 생성합니다. for 문 대신 클로져로 간단하게 선언할 수 있습니다.
filter 함수는 값을 걸러서 새로운 컨테이너를 생성합니다.
reduce 함수는 컨테이너 내부의 요소들을 모두 합칠 때 사용하는 키워드입니다. 첫 매개변수로 초깃값을 주고 그 뒤에 클로져를 넣을 수 있습니다.