스위프트 여행기 : 함수 기초, Function

프로그래밍에게 함수란?
라스의 질문같지만 프로그래밍에게 함수란 정말 전부다. 당근 스위프트에게도 마찬가지.

func 라는 키워드로 함수를 정의하며 함수의 이름과 함수에 전달할 값(파라미터)를 순서대로 적어준다.
파라미터는 전달할 데이타의 타입이 중요함으로 타입을 명시해준다.
결과값을 리턴하는 모양이 함수 이름과 파라미터의 정의 뒤에 -> 를 붙이고 리턴할 데이타의 타입을 정의한다.

func greet(name: String, day: String) -> String {
return “Hello \(name), today is \(day).”
}

풀어보면 이렇다. 두개의 문자열(스트링, String)을 주는데 하나는 name이라는 이름으로 하나는 day라는 이름으로 준다.
그 녀석들로 어떤 문자열(String)을 만들어 주는 함수다.
정의한 함수의 호출은 똑같다. 함수이름과 전달할 파라미터를 순서대로 전달한다.

프로젝트 만들기

프로젝트를 새로 만들고 ViewController.swift 를 선택하고 아래 내용 처럼 수정한다.

스크린샷 2015-01-27 오전 11.21.56

// 함수를 정의하고 추가한다.
func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(day)."
}

override func viewDidLoad() {
super.viewDidLoad()

println(greet(“Bob”, day: “Tuesday”))
self.title = greet(“Bob”, day: “Tuesday”)
}

호출할때, name 은 생략하고 day는 명시해준다. day를 빼먹으면 컴파일러한테 혼난다. 그리곤 친절하게 수정방법을 제시해준다. Fix-it을 선택하면 알아서 추가해준다.

스크린샷 2015-01-27 오전 11.25.05

스크린샷 2015-01-27 오전 11.10.23

 

 

스위프트에서는 너무나도 쉽게 여러개 값을 한방에 리턴할 수 있다. 튜플이라고 하는데 개쿨하게도 한번 호출에 여러가지 닶을 얻을 수 있다.

아래의 소스를 프로젝트를 새로 만들거나 덮어써 준다.

// 배열을 받아서 값중에 최소값, 최대값과 합을 구해서 준다.
func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
var min = scores[0]
var max = scores[0]
var sum = 0

for score in scores {
if score > max {
max = score
} else if score < min {
min = score
}
sum += score
}

return (min, max, sum)
}

override func viewDidLoad() {
super.viewDidLoad()

let statistics = calculateStatistics([5, 3, 100, 3, 9])
println(“min:\(statistics.min), Max:\(statistics.1), Sum:\(statistics.sum)”)
self.title = “min:\(statistics.min), Max:\(statistics.1), Sum:\(statistics.sum)”
}

스크린샷 2015-01-27 오전 11.36.04

풀어보면 이렇다.

구현된 함수는 전달된 배열의 첫번째 요소들을 최소, 최대값으로 일단 설정한 후
for 루프를 돌며 하나씩 값을 비교해서 새로 갱신할 값이 나타나면 최소 최대값을 수정한 후
값들을 모두 더해서 sum에 계산한다.

함수의 이름은 calculateStatistics 이며 이 함수는 파라미터로 이름은 scores이며 정수들을 가진 배열을 받느다(scores: [Int]), 그리곤 -> (min: Int, max: Int, sum: Int) , 즉 세개의 값을 반환하는데 각각 이름이 min, max, sum 이다. 차례로 최소값, 최대값, 합을 동시에 계산해서 준다.

여기에서 주의 할것은 위에 있는 소스에서 보드시 리턴될때 값들은 이름으로 혹은 인덱스(항상 인덱스는 0부터, 그래서 위에 1이라는 인덱스는 두번째의 최대값을 나타냄)이다.

스크린샷 2015-01-27 오전 11.34.35
 

 

또한 func sumOf(numbers: Int…) 다음과 같은 형식으로 갯수가 정해지지 않은 파라미터도 받을 수 있다.

댓글 남기기