처음부터 차근차근

Swift 문법 정리 3 본문

프로그래밍/Swift

Swift 문법 정리 3

_soyoung 2021. 9. 26. 13:37
반응형
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
Comments