처음부터 차근차근
Swift 문법 정리 3 본문
guard문
guard 조건식 else {
조건 거짓일 때 실행될 코드
break or return or continue or throw
}
조건 참일 때 실행될 코드
Swift 2부터 도입된 구문으로서 조건식이 거짓일 때 실행되는 문법이다.
else문 안에는 반드시 break, return, continue, throw 중 하나를 써줘야 한다.
사용 이유 : 위의 키워드를 반드시 사용해야하는 것에서 알 수 있듯이 함수나 반복문에서 빠져나가기 위함(조기 출구=early exit)이다.
활용의 대표적인 예 : guard let (옵션널 바인딩)
func test(num: Int) {
guard let number = num else {
print("num에 nil이 들어감")
return
}
print(number) // guard문 밖에서 언래핑된 number 변수를 쓸 수 있음!(if문은 못함)
}
보통 옵셔널 바인딩을 할 때 if else문을 사용하는 대신에 guard let을 사용한다.
switch-case문
var num = 10
switch num {
case 10:
print("10입니다")
case 20:
print("20입니다")
case 30:
print("30입니다")
default:
print("10, 20, 30 아님")
}
특징
- case문 마지막에 break문이 자동으로 삽입되어 있다.(그래서 break문 안써도 됨)
- 각 case문에는 반드시 적어도 하나의 코드를 작성해야한다.(안하면 error)
break문 무력화 시키는 법 : fallthrough
var num = 10
switch num {
case 10:
print("10입니다")
fallthrough
case 20:
print("20입니다")
fallthrough
case 30:
print("30입니다")
fallthrough
default:
print("10, 20, 30 아님")
}
//결과
//10입니다
//20입니다
//30입니다
//10, 20, 30 아님
일치하는 case문을 만나도 switch-case문을 빠져나오지 않고 아래로 계속 간다.
where절
부가적인 조건을 추가하는 것이다.
switch-case문, catch문, while문, guard문, for문에서 사용할 수 있다.
예
var num = 10
switch num {
case 10 where num < 30:
print("10입니다")
case 20 where num < 30:
print("20입니다")
case 30 where num < 30:
print("30입니다")
default:
print("10, 20, 30 아님")
}
var strs: [String] = ["aa", "bb", "cc", "dd", "ee"]
for str in strs where str == "bb" {
print(str)
}
//결과 : bb
함수
Swift에서는 함수를 클래스 내에 선언하면 메소드(method)라고 부른다.
(그래서 엄연히 말하면 함수 != method)
함수를 호출할 때 매개변수 : argument
함수 정의할 때 매개변수 : parameter
함수 정의와 호출
func test(param: String) -> String {
return param + "!"
}
print(test(param: "hi")) //함수호출
(param: String) : param은 매개변수 명, String은 매개변수의 자료형이다.
-> String : 함수의 반환형이다. 반환형이 Void면 생략이 가능하다.
test(param: "hi") : 함수를 호출할 때는 매개변수의 이름을 적고, 옆에 값을 적어야한다.
<함수 정의하는 여러가지 방법>
1.
func getSubValue(num1: Int, num2: Int) -> Int {
return num1 - num2
}
getSubValue(num1: 10, num2: 5)
가장 기본적인 방법이다.
2.
func getSubValue(n1 num1: Int, n2 num2: Int) -> Int {
return num1 - num2
}
getSubValue(n1: 10, n2: 5)
n1, n2 : 외부 매개변수(argument label). 함수를 호출할 때 사용하는 매개변수 이름이다.
num1, num2 : 내부 매개변수(prameter name). 함수 안에서 사용하는 매개변수 이름이다.
★★★ 외부 매개변수명을 생략하면 내부 매개변수명이 외부 매개변수명까지 겸한다.
3.
func getSubValue(_ num1: Int, n2 num2: Int) -> Int {
return num1 - num2
}
getSubValue(10, n2: 5)
_ : _를 쓰면 외부 매개변수명을 생략할 수 있다. 그래서 함수 호출할 때 매개변수 명을 쓰지 않아도 된다.
4.
func getSubValue(_ num1: Int, _ num2: Int) -> Int {
return num1 - num2
}
getSubValue(10, 5)
마찬가지로 _를 써서 외부 매개변수명을 생략한 것이다. 그래서 함수를 호출할 때 매개변수 명을 쓰지 않아도 된다.
이 방법은 잘 쓰지 않는다.
함수 명과 함수 자료형
func test(n1 num1: Int, n2 num2: Int) -> Int {
print(#function) // 함수명 출력하는 코드
return num1 * num2
}
print(test(n1: 5, n2: 2))
print(type(of:test)) // 함수 타입 출력하는 코드
이 함수의 함수 명과 함수 자료형은 다음과 같다.
함수 명 : test(n1:n2:)
함수 자료형 : (Int, Int) -> Int
함수 명은 함수의 이름과 괄호 안에 함수의 외부매개변수명이 출력된다.
★ (외부매개변수명이 없으면 내부매개변수가 외부매개변수를 겸하기 때문에 내부매개변수 명이 출력된다.)
함수 자료형은 괄호 안에 매개변수의 자료형과 -> 뒤에 함수의 반환형식이 출력된다.
+ 반환형식이 Void일 때 함수의 자료형 예 : (Int) -> ()
매개변수가 없고 반환형이 Void인 함수 자료형 : () -> ()
외부 매개변수명이 생략됬을 때(_일 때) 함수 명 : test(_:)
* 주의 : 외부 매개변수 명이 생략됬을 때만 _로 함수명이 나오는거지 외부 매개변수가 아예 없으면 내부 매개변수명이 출력된다.
디폴트 매개변수 정의
// default 매개변수
func test(param: String = "hello") -> String {
return param + "!"
}
print(test()) //함수호출
디폴트 매개변수는 자료형 옆에다 ' = 값'을 써서 정의한다.
디폴트 매개변수를 사용하면 함수를 호출할 때 매개변수를 적지 않아도 디폴트 값이 알아서 적용된다.
그래서 위 코드의 결과는 hello!가 나온다.
함수 반환 형식으로 튜플쓰기
함수 반환 형식을 튜플로 하면 동시에 여러개의 값을 반환할 수 있다.
func calculator(num: Int) -> (num1: Double, num2: Int, str: String) {
let num1 = Double(num) * 0.05
let num2 = num + 1
let str = "ksy"
return (num1, num2, str)
}
var myTuple = calculator(num: 2)
print(myTuple)
print(myTuple.num1)
print(myTuple.num2)
print(myTuple.str)
print(type(of:calculator))
//결과 : 0.1
//3
//ksy
//(Int) -> (num1: Double, num2: Int, str: String)
가변 매개변수
매개변수의 개수를 정해놓지 않고 받겠다는 뜻이다.
func printInts(ints: Int...)
{
for intV in ints {
print(intV)
}
}
printInts(ints: 1, 2, 3)
printInts(ints: 100, 25)
call by reference
call by reference란, 함수 호출할 때 '참조에 의한 호출'이라는 뜻이다.
함수 호출시 매개변수의 주소를 전달한다.
그래서 함수 안에서 파라미터 값이 변경되면, 전달된 아규멘트의 값도 함께 변경된다.
사용하는 키워드 : inout, &
-> 주솟값을 받으려면 함수를 정의할 때 자료형 앞에다 inout 써야하고, 함수 호출할 때 아규멘트 앞에다 &를 써야한다.
var catName = "kitty"
func changeName (name: inout String) -> String {
name = "lulu"
return name
}
print(catName)
print(changeName(name : &catName)) // 변수의 주솟값을 넘김
print(catName) // call by reference여서 고양이의 이름이 바뀜
//결과 : kitty
//lulu
//lulu
출처 : iOS프로그래밍기초(21-2학기)한성현교수 강의 내용 변형 및 요약
'프로그래밍 > Swift' 카테고리의 다른 글
Swift 문법 정리 4 (0) | 2021.09.30 |
---|---|
Switf 실습 4 (0) | 2021.09.30 |
Swift 실습 3 (0) | 2021.09.25 |
Swift 문법 정리 2 (0) | 2021.09.17 |
Swift실습2 (0) | 2021.09.17 |