[Swift] #5 - 함수
2021. 9. 1. 14:34ㆍiOS Development/Swift
** 함수
- 프로그램의 기본적인 구성요소로, 어떤 작업을 수행하는 문장의 그룹을 의미함
- ex) 레고 블럭
- 가독성의 증대, 유지관리가 쉬움
- 재사용 가능한 코드블럭
** 함수 정의
// 함수 정의
func sayHello(name: String) -> String {
return "Hello \(name)"
}
// 함수 호출
print(sayHello(name: "미지"))
func multipl(dan: Int) {
for j in 1...9 {
print("\(dan) X \(j) = \(dan * j)")
}
}
multipl(dan: 5)
** 함수의 매개변수
- 매개변수의 개수: 제한이 있긴 하지만 크게 신경 쓸 필요가 없음
- 반환값의 개수: 1개만 가능 / 여러개의 데이터를 전달하고 싶으면 Collections 사용
// 매개변수
func sayHelloWithName(name: String, age: Int) -> String {
return "\(name) is \(age) years old !"
}
print(sayHelloWithName(name: "miji", age: 25))
// 내부 매개변수와 외부 매개변수
// 외부 매개변수: 호출시 사용 / detail
// 내부 매개변수: 정의시 사용 / simple, short
func sayHello(exName name: String, exAge age: Int) -> String {
return "\(name) is \(age) years old !"
}
// 오버로딩
print(sayHello(exName: "miji suh", exAge: 20))
// 함수 호출시 외부 매개변수를 생략하고 싶을 때 _(언더 스코어) 사용
func sayHello(_ name: String, _ age: Int) -> String {
return "\(name) is \(age) years old !"
}
print(sayHello("mj", 10))
// 매개변수의 기본값: 매개변수가 없을 경우 사용
func sayHi(name: String = "디폴트") {
print("Hi \(name) !")
}
sayHi(name: "서미지")
sayHi()
** 예제
- 계산기 함수 만들기
// 계산기 함수
func calculator(num1: Int, op: String, num2: Int) -> Int {
var result = 0
switch op {
case "+": result = num1 + num2
case "-": result = num1 - num2
case "*": result = num1 * num2
case "/": result = num1 / num2
case "%": result = num1 % num2
default: result = Int.max // 연산자가 이상한 값으로 입력받았을 경우
}
return result
}
var num1 = 5
var num2 = 4
var op = "+"
print("\(num1) \(op) \(num2) = \(calculator(num1: num1, op: op, num2: num2))")
** 가변인자 매개변수
- 개수가 정해져있지 않는 매개변수
- 내부적으로 Array 하나로 받음
// 가변인자 매개변수
func avg(scores: Int...) -> Double {
var total = 0
for score in scores {
total += score
}
return (Double(total) / Double(scores.count))
}
print(avg(scores: 1, 2, 3, 4, 5, 6)) // 반마다 학생 수가 다름
** 튜플 반환 함수
// 튜플 반환 함수
func swap(firstNumber n1: Int, secondNumber n2: Int) -> (Int, Int) {
return (n2, n1)
}
let result1 = swap(firstNumber: 3, secondNumber: 4)
print(result1)
let (first, second) = swap(firstNumber: 3, secondNumber: 4)
print(first)
print(second)
** 변수의 범위와 생명주기
// 변수의 범위와 생명주기
do {
do {
let ccnt = 3
print(ccnt) // 3
}
// print(ccnt) -> error: cannot find 'ccnt' in scope
}
do {
let ccnt: Int = 0
do {
let ccnt = 3
print(ccnt) // 3
}
print(ccnt) // 0
}
var count = 30
func foo() -> Int {
return count // 30
}
func foo(count1: Int) -> Int {
return count1
}
// print(count1) -> error: cannot find 'count1' in scope
print(foo()) // 30
print(foo(count1: 0)) // 0
var count2 = 3
func foo1(count2: Int) -> Int {
return count2
}
print(count2) // 3
print(foo1(count2: 2)) // 2
** 변수의 검색 순서
** 예제
- 평점 계산기
-
// 점수를 입력 받아 평점을 구하는 함수 func calcGrade(score: Int) -> String { var grade = "" if score >= 90 { grade = "A" } else if score >= 80 { grade = "B" } else if score >= 70 { grade = "C" } else if score >= 60 { grade = "D" } else { grade = "F" } // 간단하게 표현하는 방법 // var score1 = score / 10 // switch score1 { // case 9, 10: grade = "A" // case 8: grade = "B" // case 7: grade = "C" // default: grade = "F" // } return grade } print(calcGrade(score: 95))
- 젯수와 피젯수를 입력받아 몫과 나머지 계산
-
//몫, 나머지 계산 func divide(firstNumber n1: Int, secondNumber n2: Int) -> (Int, Int) { return (n1 / n2, n1 % n2) } print(divide(firstNumber: 15, secondNumber: 4))
- 로또 발생기
- 랜덤 발생 함수 arc4random() 사용 / 반환값 타입은 UInt32형이므로 Int() 로 형변환
- Set.sorted() : 순서가 생김 -> Array
-
// 로또 발생기 func getRandomNum() -> [Int] { var lotto:Set<Int> = [] while lotto.count < 6 { // 중복이 얼마나 될 지 모르기 때문에 횟수를 알 수 없음 lotto.insert(Int(arc4random() % 45 + 1)) // 1 ~ 45 } return lotto.sorted() // Array를 반환 } print(getRandomNum())
** 함수의 형
- 함수도 매개변수와 반환값에 따라서 형(Type)이 나뉨
// 함수의 형(Type)
// ()->() 형
func helloWorld1() {
print("Hello World")
}
let func1:()->() = helloWorld1 // 함수이름으로 주소 참조
func1()
let func2 = helloWorld1 // 형추론 가능
func2()
// (String)->() 형
func helloWorld2(name:String) {
print("Hello world \(name)님")
}
let func3:(String)->() = helloWorld2
func3("미지")
let func4 = helloWorld2
func4("미지")
func greeting1(name:String) {
print("Hello \(name)")
}
** 함수형 매개변수 및 반환값
- 일처리 순서가 중요할 때, 매개변수로 함수를 넣어서 순차적으로 함수를 발생시켜 진행함
// 매개변수로 함수 사용
func greeting2(name:String, gfunc:(String)->()) {
gfunc(name)
}
greeting2(name: "서미지", gfunc: greeting1)
// 출력값이 함수
func greeting3() -> (String)->() {
return greeting1
}
let greet = greeting3() // (String)->() 생략
greet("미지서")
'iOS Development > Swift' 카테고리의 다른 글
[Swift] #6 - Class (0) | 2021.09.03 |
---|---|
[Swift] #4 - Collections (0) | 2021.08.30 |
[Swift] #3 - 흐름 제어 (0) | 2021.08.27 |
[Swift] #2 - 연산자 (0) | 2021.08.26 |
[Swift] #1 - 상수와 변수 (0) | 2021.08.26 |