- 파일간 또는 모듈간의 접근을 제한하는 기능이다. 이를 통해서 코드의 상세구현은 숨기고 허용된 기능만 사용하는 인터페이스 구축이 가능하다.
- 스위프트의 접근제어는 모듈과 소스파일을 기반으로 설계되어 있다. 모듈은 배포할 코드의 묶음단위이다. import키워드를 통해서 호출이 가능하다.
- 접근수준은 open, public, internal, fileprivate, private 순으로 다섯가지 분류가 가능하다. open이 가장 개방적이며, private이 가장 폐쇄적인 단계이다.
- open은 클래스에서만 사용이 가능하다. 구조체는 public부터 사용이 가능하다.
- 접근 수준은 폐쇄적인 타입 안에 그보다 개방적인 타입을 가질 수 없다. 예를 들어서 클래스가 private이면 메소드는 private 이상의 접근 제어수준을 가질 수 없다.
- 기본적으로 접근수준은 모두 interal수준을 가지고 있다. 명시되어 있지 않은 경우 interal 접근 수준을 가진다.
- 클로저는 변수나 상수가 선언된 위치에서 참조를 획득하고 저장할 수 있다.
- 클로저에는 대표적인 3가지 형태가 있다. 첫째는 '이름이 있으면서 어떤 값도 획득하지 않는 전역함수 형태', '이름이 있으면서 다른 함수 내부의 값을 획득할 수 있는 중첩함수의 형태', '이름이 없고 주변 문맥에 따라 값을 획득하는 축약 문법으로 작성한 형태'.
- 클로저는 매개변수와 반환 값의 타입을 문맥을 통해 유추 가능하므로 생략이 가능하다.
- 클로저에 단 한줄의 표현만 있다면 암시적으로 이를 반환값으로 유추한다.
- 축약된 전달인자 이름을 사용 가능하다.
- 후행 클로저 문법을 사용할 수 있다. 후행 클로저는 함수나 메서드의 마지막 전달인자로 위치하는 클로저이며, 이는 소괄호를 닫은 후 {} 안에 클로저 표현을 해주는 문법이며 가독성이 좋다. 후행 클로저는 맨 마지막 전달인자로 전달되는 클로저만 해당되며, 여러개를 전달 시 맨 마지막 클로저만 후행클로저 사용이 가능하다.
- 매개변수에 클로저가 여러개인 경우 다중 후행 클로저 문법을 사용할 수 있다.
- 클로저에서는 전달되는 파라미터에 대해서 단축 인자 이름을 사용할 수 있으며, $0, $1 순으로 표현이 가능하다.
- 함수와 클로저는 기본적으로 참조 타입이다. 따라서 함수나 클로저를 상수나 변수에 할당할 때 사실 상수나 변수에 함수나 클로저의 참조를 설정하는 것이다.
- 함수의 전달인자로 전달한 클로저가 함수 종료 후 호출될 때 클로저가 함수를 탈출한다고 표현한다. @escaping 키워드를 파라미터에 명시하여 나타낼 수 있다.
- 매개변수로 사용되는 클로저들은 기본적으로 비탈출 클로저이다. 함수로 전달된 클로저가 함수의 동작이 끝난 후 사용할 이유가 없는 경우는 비탈출 클로저를 사용한다.
- 예를 들어서 비동기 작업을 위해서 컴플리션 핸들로 전달인자를 이용해 클로저 형태로 받는 함수가 있다. 함수가 작업을 종료하고 난 이후(return이후에) 클로저를 호출하게 되므로 클로저는 함수를 탈출해 있어야 한다.
- 전달하는 표현을 자동으로 변환해주는 클로저를 자동 클로저라고 하며, 이 자동 클로저는 전달인자가 없는 클로저이다. 자동 클로저는 클로저 문법을 사용하지 않고도 클로저 사용이 가능도록 문법 편의를 제공한다.
- 자동클로저는 @autoclosure 라는 키워드를 통해서 명시해준다. 또한 자동클로저는 기본적으로 비탈출 클로저이므로, 자동 탈출클로저를 위해선 키워드를 병렬로 나타내줘야한다. @autoclosure @escaping () -> ()이런 것처럼 해줘야 한다.