24
Function 오근현 소프트웨어 엔지니어 #Go To Swift 16 3번째 시간

[SwiftStudy 2016] 3장. 함수

Embed Size (px)

Citation preview

Page 1: [SwiftStudy 2016] 3장. 함수

Function

오근현 소프트웨어 엔지니어

#Go To Swift 163번째 시간

Page 2: [SwiftStudy 2016] 3장. 함수

학습목표

• 함수의 선언과 사용을 알 수 있다.

• closure를 알 수 있다.

Page 3: [SwiftStudy 2016] 3장. 함수

함수 선언/정의: 생김새

나는 함수다! 파라메터명 파라메터 타입

반환값 타입

함수명

Page 4: [SwiftStudy 2016] 3장. 함수

함수 호출

Arg Label파라메터함수명

반환값이 있는 함수는 return값을 받지 않으면 warning (Swift 3)

반환값을 사용하지 않을때는 명시적으로 사용하지 않음을 표기

‘_’ 는 사용하지 않는 변수 등의 이름을 위해 정의된 특별한 키워드(이따 또 나옵니다)

Page 5: [SwiftStudy 2016] 3장. 함수

함수 선언/정의: 반환 값이 없으면 반환 타입 생략 또는 Void

Page 6: [SwiftStudy 2016] 3장. 함수

함수 선언/정의: 함수 파라메터는 상수로 취급

반환값 타입

참고: Swift 2.x까지는 var 키워드를 파라메터 앞에 붙이면 함수 파라메터를 변경 가능한변수로 사용 가능Swift 3에서는 var 키워드 허용하지 않음

Page 7: [SwiftStudy 2016] 3장. 함수

함수 선언/정의: Argument Labels

함수를 사용할때 붙는 arg1과 arg2의 정체?Argument Labels

Default Argument Label: Parameter Name

argument label을 생략하면 argument label은 파라메터 이름과 동일

argument label을 파라메터 이름과 다르게 사용하고 싶으면,파라메터 이름 앞에 argument Label을 적으면됨

함수를 호출할때 변경한 argument label을 붙여야함

Page 8: [SwiftStudy 2016] 3장. 함수

함수 선언/정의: Argument Labels (계속)

argument label을 파라메터 이름과 다르게 사용하고 싶으면,파라메터 이름 앞에 argument Label을 적으면됨

함수를 호출할때 변경한 argument label을 붙여야함

‘_’ 키워드를 argument label에 붙이면 함수 호출시 argument label 생략됨

참고: Swift 2.x 버전까지는 Objective-C의 사용 습관을 이어받아 첫번째 argument label은 암묵적으로 생략됨.

Page 9: [SwiftStudy 2016] 3장. 함수

함수 선언/정의: Argument Labels (계속)

• Argument Labels을 통해 얻을 수 있는 이점? 명료함과 가독성을높일 수 있음

• Argument Labels 수정을 통해 얻을 수 있는 이점? 문장처럼 함수설계 가능

• 예를 들어,

Page 10: [SwiftStudy 2016] 3장. 함수

함수 선언/정의: 튜플 타입 반환

튜플타입을 이용하여 여러 값을 반환 가능

Page 11: [SwiftStudy 2016] 3장. 함수

함수 선언/정의: 함수 타입

• 함수에도 타입이 있음

• 예를 들어, 아래 함수의 타입은 (Int, Int)->Int

• 함수에도 타입이 있기에 함수도 함수의 파라메터와 반환 값으로사용 가능

Page 12: [SwiftStudy 2016] 3장. 함수

함수 선언/정의: 함수 타입 파라메터 예시

함수 타입 파라메터

함수를 파라메터로 넘김

Page 13: [SwiftStudy 2016] 3장. 함수

함수 선언/정의: 함수 타입

함수 타입 반환

반환 받은 함수를 사용

Page 14: [SwiftStudy 2016] 3장. 함수

Nested functions

• 함수 안에 함수 사용 가능

• 함수도 class와 struct 와 같은 타입

• 함수 안에 함수는 부모 함수의 변수를 참조 가능 (마치, class와struct의 멤버 변수처럼)

함수 안에 함수 사용 가능

Page 15: [SwiftStudy 2016] 3장. 함수

Closures

• Clousure 지원

• Clousures? self-contained blocks of functionality that can be passed around and used in your code

• 프로그램 상 전달 가능한 코드 블럭

• 함수도 Clousures의 종류 ==> 그러니까 앞에서 말한 함수에 대한특징들이 적용됨

• 실제 Cocoa/Cocoa Touch API 사용시 Clousures를 많이 사용하게됨

Page 16: [SwiftStudy 2016] 3장. 함수

Closures 사용 예시

소박하게 아까 배운 대로 전역 함수를 파라메터로 넘기는 것 부터 시작…

Page 17: [SwiftStudy 2016] 3장. 함수

Closures 사용 예시 (계속)

함수 네이밍을 없애고 직접 적음. 모양새가 closure 같아짐?!

in 이후부터 body 시작

Page 18: [SwiftStudy 2016] 3장. 함수

Closures 사용 예시 (계속)

입력 파라메터 함수 타입이 명확하기 때문에 closure의 반환 타입 추론가능==> 생략가능

Page 19: [SwiftStudy 2016] 3장. 함수

Closures 사용 예시 (계속)

single-expression closure의 경우 어차피 한줄 적은게 반환되는 값임==> return 키워드 생략가능

Page 20: [SwiftStudy 2016] 3장. 함수

Closures 사용 예시 (계속)

파라메터는 2개이고 각 파라메터의 타입도 어차피 알고 있음.==> in 키워드와 파라메터 네이밍 선언 부분 생략 가능

Page 21: [SwiftStudy 2016] 3장. 함수

Closures 사용 예시 (계속)

2개의 값을 비교하는 경우에는 굳이 파라메터를 내부에서 구별할 필요도 없음==> operation만 명시 가능

Page 22: [SwiftStudy 2016] 3장. 함수

Closures 사용 예시 (계속)

Page 23: [SwiftStudy 2016] 3장. 함수

Closures 사용 예시 (계속)

코드 줄이는건 신났는데…closure 내의 코드 량이 많으면 어떡함?

Page 24: [SwiftStudy 2016] 3장. 함수

Trailing closures

• closure의 코드 량이 많아지면 함수 선언이 복잡해짐. 끝을 따라가기 힘듦

• closure 파라메터가 함수의 마지막 파라메터로 오는 경우, 함수 선언을 모두 마친 이후에 기재 가능

• 예를 들어,

예전 버전. 이것보다 선언이 명확하고 깔끔해짐