상세 컨텐츠

본문 제목

Swift언어 복습노트 4 - 함수와 Optional

Swift언어

by 앱등개발자IOS 2022. 9. 10. 15:32

본문

# Swift 함수 ( Function )

 

Swift에서의 "함수"일급객체이며, 다른 언어에서보다 훨씬 다양한 모습으로 작성할 수 있다.

따라서 협업자끼리 코딩 규칙을 정하는 것이 매우 중요하다!

 

- Swift는 오버로딩, 오버라이딩 모두 지원 

- 전달인자  레이블 이름만 달라도 다른함수!! -> 오버로딩됨!! 

- 매개변수 기본값은 다른 언어와 같은 방식으로 사용 가능 ( 기본값 있는건 뒷쪽에 사용!)

 

#함수 형태( 전달인자 레이블, 매개변수 이름, 반환형 설정 등)

func 함수이름(전달인자 레이블 매개변수 이름: 매개변수 타입, ....) -> 반환형 {  ... }

 

전달인자 레이블외부에서의 역할에 대한 명칭 붙여줄 수 있다!

사용하고싶지 않으면, func 함수이름(    매개변수 이름: 매개변수 타입, ....) -> 반환형 {  ... } 와 같이 와일드카드 사용하면 함수 외부, 내부에서 ( 내부 구현할 때와 외부에서 호출할 때 같은 이름으로 설정 가능)

 

# 가변 매개변수 

- 0개 이상(0개 포함)의 가변매개변수를 받아 "배열"처럼 사용 가능- 함수마다 가변매개변수는 "하나" 가질 수 있다.

 

# 참조전달 : inout ( 입출력 매개변수 )

- C포인터와 유사. 함수 내부에서 참조하여 원래 값 변경!

 

# Swift의 함수는 "일급객체"

- 데이터타입으로 사용 가능

- 전달인자

- 반환값이 될 수 있다.

 

# Swift의 중첩함수!

Swift에서는 클래스 안의 클래스, 열거형 안의 열거형, 함수 안의 함수 등 다양한 중첩 패턴을 만들어 볼 수 있다.

##중첩함수

 

    - 상위 함수 블록 내부에서만 사용 가능 ( 내부의 함수를 return해주어 밖에서 사용  가능하게 하는 방법도 있음 )

    - 굳이 전역모듈로 사용할 필요 없는 함수 => 함수 안쪽으로 배치하여 중첩함수로 구현

    - 함수의 사용범위를 명확, 깔끔 표현가능!

 

# 종료되지 않는 함수( Nonreturning Func) & 반환값 무시할 수 있는 함수 ( @discardableResult)

비반환 함수 = 종료되지 않는 함수의 return타입은 Never로 명시해주면 된다.

 

return값을 사용하지 않아도 경고가 뜨지 않는다!

# Swift 옵셔널 ( Optional )

 

Swift에서의 "Optional"은 안정성 (null safety)를 담보해주는 기능이다.

함수형 프로그래밍 패러다임에 자주 등장하는 Monad 개념과 일맥상통!

- nil은 옵셔널 변수 혹은 옵셔널 상수에만 사용 가능

 

## 어디서 옵셔널을 사용하는가?

- 값이 있을 수도, 없을 수도 있다는 의미

-  매개변수를 굳이 넘기지 않아도 된다는 뜻

- nil을 반환하여 오류가 있음을 알리는 용도

이처럼 하나의 기능으로 여러 의미를 내포하여 원활한 의사소통이 가능하다.

 

## 옵셔널은 제네릭이 적용된 열거형!!

- switch 구문을 통해 값이 있고 없음을 확인할 수 있다.

 

옵셔널의 Definition

nil일 때는 none케이스가 되는 것,

값이 있을 때는 some케이스가 되며, 해당 값이 some케이스의 연관값인 Wrapped에 할당되는 것!

 

따라서 옵셔널 자체가 열거형이므로  switch구문을 통해 값의 유무를 확인하는 것

 

# Optional 추출 방법

## 1. 강제 추출

!사용하여 강제 추출하여 반환

- nil이라면 런타임오류 발생

- if문으로 체크하여 한 층 안전하게 처리 가능

ex) if a != nil { ~~~} else { ~~}

 

## 1. 옵셔널 바인딩

- if let 혹은 if var

- if, else if, else모두 가능 

- 아래 코드의 str같은 임시 상수(혹은 변수)는 if블록 밖에서는 사용 불가!!

- 여러 변수 동시에 옵셔널 바인딩 가능 (but, 그 중 하나라도 nil이면 실행 X)

 

nil이 아닌 경우
오류 없이 진행

이외에도 var a: String! = "str..."과 같은 암시적 추출 옵셔널이 있지만 사용 비추..

관련글 더보기