Swift 함수 고급 문법

Steve Jack·2021년 7월 16일
0

Swift 문법(야곰)

목록 보기
5/9
post-thumbnail

야곰님의 강의 자료

매개변수 기본 값

매개변수에 기본적으로 전달될 값을 미리 지정해 둘 수 있습니다.
기본값을 갖는 매개변수는 매개변수 목록 중 뒤쪽에 위치하는 것이 좋습니다.

func 함수이름(매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 = 매개변수 기본값 ...) -> 반환타입 {
    /* 함수 구현부 */
    return 반환값
}

func greeting(friend: String, me: String = "yagom") {
    print("Hello \(friend)! I'm \(me)")
}

// 매개변수 기본값을 가지는 매개변수는 호출시 생략할 수 있습니다
greeting(friend: "hana") // Hello hana! I'm yagom
greeting(friend: "john", me: "eric") // Hello john! I'm eric

전달인자 레이블(Argument Label)

함수를 호출할 때 함수 사용자의 입장에서 매개변수의 역할을 좀 더 명확하게 표현하고자 할 때 사용합니다.
전달인자 레이블은 변경하여 동일한 이름의 함수를 중복으로 생성가능합니다.

func 함수이름(전달인자 레이블 매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입 ...) -> 반환타입 {
    /* 함수 구현부 */
    return
}

// 위 greeting함수와 똑같은 이름의 중복정의지만 Swift내에서는 greeting to에서 from까지 함수이름으로 취급
func greeting(to friend: String, from me: String) {
    print("Hello \(friend)! I'm \(me)")
}

// 함수를 호출할 때에는 함수 외부에서 전달인자 레이블을 사용해야 합니다
greeting(to: "hana", from: "yagom") // Hello hana! I'm yagom

함수 외부에서 to라는 전달인자 레이블을 사용해서 함수 호출
함수 내부에서는 friend란 매개변수이름을 가지고 매개변수 사용

가변 매개변수

전달 받을 값의 개수를 알기 어려울 때 사용합니다.
가변 매개변수는 함수당 하나만 가질 수 있습니다.
기본값이 있는 매개변수와 같이 가변 매개변수 역시 매개변수 목록 중 뒤쪽에 위치하는 것이 좋습니다.

func 함수이름(매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입...) -> 반환타입 {
    /* 함수 구현부 */
    return
}

// 맨뒤 매개변수타입 뒤에 ... 찍고 사용
// friends가 몇명이 되어도 상관없다라는 뜻
func sayHelloToFriends(me: String, friends: String...) -> String {
    return "Hello \(friends)! I'm \(me)!"
}

print(sayHelloToFriends(me: "yagom", friends: "hana", "eric", "wing"))
// Hello ["hana", "eric", "wing"]! I'm yagom!

//가변인자에 아무값도 넣고 싶지않다면 전달인자 레이블 생략
print(sayHelloToFriends(me: "yagom"))
// Hello []! I'm yagom!

데이터 타입으로서의 함수

Swift에서 함수는 하나의 데이터 타입으로서 표현
스위프트는 함수형 프로그래밍 패러다임을 포함하는 다중 패러다임 언어이므로 스위프트의 함수는 일급객체입니다. 그래서 함수를 변수, 상수 등에 할당이 가능하고 매개변수를 통해 전달할 수도 있습니다.
함수의 타입 표현 : 반환 타입을 생략할 수 없습니다.

// (매개변수1타입, 매개변수2타입 ...) -> 

func greeting(to friend: String, from me: String) {
    print("Hello \(friend)! I'm \(me)")
// someFunction 변수에다가 매개변수가 두개이며, 반환값이 없는 함수가 들어올수 있다라고 명시후
// 아까 만든 greeting이란 함수를 변수에 할당
var someFunction: (String, String) -> Void = greeting(to:from:)

someFunction("eric", "yagom") // Hello eric! I'm yagom, greeting 함수랑 결과가 같음


func greeting(friend: String, me: String = "yagom") {
    print("Hello \(friend)! I'm \(me)")
}
someFunction = greeting(friend:me:)
someFunction("eric", "yagom") // Hello eric! I'm yagom


func sayHelloToFriends(me: String, friends: String...) -> String {
    return "Hello \(friends)! I'm \(me)!"
}
// 타입이 다른 함수는 할당할 수 없습니다 - 컴파일 오류 발생(friends는 가변매개변수이기 때문에 타입이 다름)
someFunction = sayHelloToFriends(me: friends:)


// 함수타입을 매개변수 타입으로 지정
// function이란 매개변수를 안에서도 실행가능
func runAnother(function: (String, String) -> Void) {
    function("jenny", "mike")
}
runAnother(function: greeting(friend:me:)) // Hello jenny! I'm mike


//var someFunction: (String, String) -> Void = greeting(to:from:)
runAnother(function: someFunction) // Hello jenny! I'm mike
profile
To put up a flag.

0개의 댓글