Swift 문법 - 함수(Function)

eelijus·2022년 12월 30일
0

Swift Syntax

목록 보기
9/11

💡 함수, 가변 매개변수, 전달인자 레이블, 데이터 타입으로서의 함수

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html

함수의 선언과 호출

기본 형태

import Foundation

func 함수명(매개변수명: 매개변수타입, 매개변수명, 매개변수타입) -> 반환타입 {
    //코드 구현부
    return 반환값
}
func sum(a: Int, b: Int) -> Int {
  return a + b
}

sum(a: 12, b: 6)

반환값이 없는 형태

func printName(name: String) -> Void {
  print(name)
}

//반환 타입을 생략할 수 있다.
func printName(name: String) {
  print(name)
}

printName(name: "sujilee")

매개변수가 없는 형태

func maximumIntegerValue() -> Int {
  return Int.max
}

maximumIntegerValue()

매개변수와 반환값이 없는 형태

func sayHello() {
  print("hello")
}

sayHello()

함수에서 두 개 이상의 값을 반환하는 방법

  • 튜플 사용 - 아주 좋은 방법
  • 컬렉션 사용 (배열 또는 딕셔너리 사용)
튜플 사용 예시

func getCadetInfo() -> (intraID: String, coalitions: String) {
  (intraID: "sujilee", coalitions: "Gam")
}

let cadet = getCadetInfo()

//함수의 반환값에의 접근
print(cadet.intraID, cadet.coalitions)
//OUTPUT : sujilee Gam

매개변수의 기본값을 가지는 함수

import Foundation

//기본값을 갖는 매개변ㄴ수는 매개변수 목록 중 뒤쪽에 위치하는 것이 좋다.
func 함수명(매개변수이름: 매개변수타입, 매개변수이름: 매개변수타입 = 매개변수기본값) -> 반환타입 {
    //함수 구현부
    return 반환값
}
func versus(challenger: String, champion: String = "sujilee") {
    print("\(champion) vs \(challenger)")
}

//기본값을 가지는 매개변수는 함수 호출 시 생략할 수 있다.
versus(challenger: "jji")
//OUTPUT : sujilee vs jji

//기본값을 가지는 매개변수의 값을 원하는 값으로 갱신하는 것도 가능
versus(challenger: "leelea", champion: "sujilee")
//OUTPUT : sujilee vs leelea

전달 인자 레이블

함수 외부에서. 즉 함수 호출 시 함수의 매개변수의 역할을 더 명확히 표현하고자 할 때 사용한다.

import Foundation

func 함수명(전달인자레이블 매개변수명: 매개변수타입) -> 반환타입 {
    //코드 구현부
    return 반환값
}
//함수 내부에선는 전달인자레이블을 사용할 수 없다.
func inviteFriend(to friend: String, from host: String) {
    print("\(host) invites \(friend)")
}

//함수 호출 시에는 매개변수명을 사용할 수 없다.
//오로지 전달인자레이블만 사용해야 함.
inviteFriend(to: "jji", from: "sujilee")
//OUTPUT : sujilee invites jji
  • 전달인자 레이블의 사용을 원치 않을 경우 와일드카드 식별자를 사용할 수 있다.
func sendLetter(from writter: String, to reciever: String) -> String {
    return "\(writter)는 마음을 담아 \(reciever)에게 편지를 보낸다."
}

print(sendLetter(from: "sujilee", to: "jji"))
//OUTPUT : sujilee는 마음을 담아 jji에게 편지를 보낸다.

//와일드카드 식별자 사용
func sendLetter(_ writter: String, _ reciever: String) -> String {
    return "\(writter)는 마음을 담아 \(reciever)에게 편지를 보낸다."
}

print(sendLetter("sujilee", "jji"))
//OUTPUT : sujilee는 마음을 담아 jji에게 편지를 보낸다.

함수의 전달 인자 레이블이 서로 다르다? 다른 함수이다. 이는 전달인자 레이블만 바꿔 함수를 오버로딩하는 것을 가능하게 한다.


가변 매개변수

전달받을 인자의 개수를 알기 어려울 때 사용하며, 함수당 하나의 가변 매개변수만 사용할 수 있다.

import Foundation

func 함수명(매개변수명: 매개변수타입, 전달인자레이블 매개변수명: 매개변수타입...) -> 반환타입 {
    //코드 구현부
    return 반환값
}
func inviteFriends(host: String, friends: String...) -> String {
    return "sujilee invites \(friends)"
}

print(inviteFriends(host: "sujilee", friends: "jji", "hyobagi", "jyp", "jinbe"))
//OUTPUT : sujilee invites ["jji", "hyobagi", "jyp", "jinbe"]

//가변 매개변수는 생략 가능하다.
print(inviteFriends(host: "sujilee"))
//OUTPUT : sujilee invites []

데이터 타입으로서의 함수

스위프트는 함수형 프로그래밍 패러다임을 포함하는 다중 패러다임 언어이므로, 스위프트의 함수는 일급 객체이다. 따라서 함수를 변수, 상수 등에 할당할 수 있으며 매개변수를 통해 전달할 수도 있다.

import Foundation

func printField(cadet: String, field: String) -> Void {
    print("\(cadet)'s field is \(field)")
}

//함수의 타입 표현. 반환타입의 생략은 불가능하다.
//var 변수명: (매개변수타입, 매개변수타입) -> 반환타입 = 함수명)매개변수
var someFunction: (String, String) -> Void = printField(cadet:field:)
someFunction("sujilee", "iOS")
//OUTPUT : sujilee's field is iOS

//변수, 상수의 타입을 생략해도 할당하는 함수를 통해 타입을 추론할 수 있다.
//반환타입도 생략할 수 있으나 권장되는 않는지 아래처럼 fix 해준다.
var someFunctionWithoutType: Void = printField(cadet: "sujilee", field: "iOS")
//OUTPUT : sujilee's field is iOS
  • 변수와 타입이 다른 함수는 할당할 수 없다,
func printMacbook(owner: String, someMac: String) -> String {
    return "\(owner)'s Macbook is \(someMac)"
}

var someFunction: (String, String) -> Void

//ERROR : 컴파일 오류 발생
// Cannot assign value of type 'String' to type '(String, String) -> Void'
someFunction = printMacbook(owner: "sujilee", someMac: "intel Macbook pro 16")
  • 함수의 전달인자로서의 함수
func smallerFunction(size: String) -> Void {
    print("this function prints \(size) function")
}

//biggerFunction은 매개변수의 타입이 String이고 반환타입이 Void인 어떤 함수를 인자로 받을 것이다.
//인자로 받은 함수의 매개변수에 값을 할당한다.
func biggerFunction(function: (String) -> Void) {
    function("small")
}

//biggerFunction의 인자로 smallerFunction을 넘긴다.
//smallerFunction의 인자값은 이미 biggerFunction의 코드 구현부에서 할당해줬음
biggerFunction(function: smallerFunction(size:))
//OUTPUT : this function prints small function
  • 심화 예시
func printUniversity(name: String, university: String) -> Void {
    print("\(name) is student of \(university)")
}

var someFunction: (String, String) -> Void
someFunction = printUniversity(name:university:)
//함수 printUniversity에 인자로 넘어온 값이 없으니, printUniversity 변수 someFunction에는 아무 값도 없는 상태이다.


func runAnotherFunction(function: (String, String) -> Void) {
    function("sujilee", "KU")
}
//runAnotehrFunction 내부에서 값 "sujilee"와 "KU"를 printUniversity
//따라서 변수 someFunction는  "sujilee"와 "KU"를 인자값으로 갖고 있는 printUniversity를 값으로 갖고 있다.

//함수를 매개변수로 하는 runAnotherFunction에 someFuntion을 인자로 넘긴다.
//someFunction의 타입은 함수이고, "sujilee"와 "KU"를 가지고 있는 함수 printUniversity를 값으로 가지고 있기 때문에 가능하다.
runAnotherFunction(function: someFunction)
//OUTPUT : sujilee is student of KU




참고 :

https://yagom.github.io/swift_basic/contents/04_function/

https://seons-dev.tistory.com/46

profile
sujileelea

0개의 댓글