- 구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용되는 함수를 메서드, 전역적으로 사용되는 함수를 그냥 함수라고 말한다.
- 함수는 기본적으로 매개변수와 반환타입으로 정의한다. 이 때 매개변수는 함수 정의 시 외부로부터 받는 전달 값의 이름을 의미하며, 전달인자는 함수를 실제 호출하는 경우 전달하는 값을 의미한다. 레이블이라고도 말한다.
- 함수에서는 매개변수(파라미터)의 기본값을 지정해서 함수를 정의할 수 있으며, 이를 지정할 시 해당 파라미터에는 자동으로 기본값이 할당되어 함수를 수행하게 된다.
- 가변 매개변수의 사용이 가능하며, 파라미터의 타입 앞에 inout 키워드를 사용한다. 그리고 함수를 실행할때는 앰퍼센드 기호를 명시해준다.(&) 상수는 변경이 불가하므로 파라미터 사용이 안 된다.
- 반환이 없는 함수도 정의 가능하다. () -> () 다음과 같이 표현하거나 () -> Void라는 키워드를 사용해서 반환타입이 없음을 정의간에 나타낸다.
- 함수는 1급 객체이므로 데이터 타입으로서도 역할이 가능하다. () -> ()등의 함수가 가지는 파라미터와 반환값의 형태는 그 자체로 데이터 타입의 역할이 가능하다.
- 파라미터만을 사용한 함수의 축약표현이 가능하다. sayHello(name : String, time : Int) -> String, 이 함수의 축약은 sayHello(name:time:)다음과 같이 나타낼 수 있다.
- 함수는 1급 객체로서 중첩 함수 구현이 가능하다. 쉽게 말하면 함수 안에 함수를 새로 정의하여 사용할 수 있다.
- @discardableResult 키워드를 앞에 붙이면 이는 반환값을 무시 가능한 함수임을 나타낼 수 있도록 해준다. 반환타입이 있는 함수에 해당 키워드를 붙이는 경우 별도의 반환값을 명시하지 않아도 컴파일링에서 오류가 발생하지 않는다.
- 옵셔널은 단어 뜻 그대로, 선택적으로서 그 값이 있을 수도 없을수도 있음을 나타낸다. 하지만 통상 값이 부재할 수 있음의 가능성을 명시하는 코드로 사용되는 경우가 많다.
- nil을 통해서 값의 껍데기는 있으나 값 자체가 공백임을 나타낼 수 있으며, nil은 반드시 옵셔널로 선언된 곳에서만 사용이 가능하다.
- 옵셔널은 열거형으로 구성된 타입이다. 제네릭이 적용된 열거형으로서 모든 타입에 대해서 대응이 가능한 데이터 타입이다. nil의 경우 none케이스를 실행하며, 값이 있는 경우는 some케이스로 실행된다. 이 때 연관값 wrapped 에 대해서 래핑된 값이 할당된다. 이를 벗겨서 사용하는 것이 언래핑으로서 방법에는 옵셔널 바인딩과 강제 언래핑이 있다.
- 바인딩은 코드의 안정성을 보장하는 가운데 효과적으로 언래핑이 가능하며, 강제 언래핑은 간단하지만 가장 위험하다. 이 경우 nil이 확인되는 경우 런타임오류가 생기게 된다.
- 옵셔널 바인딩은 if let, guard 구문을 주로 사용하여 실행되며, 강제 언래핑은 옵셔널 타입의 프로퍼티에 !를 명시하여 수행한다.