티스토리 뷰

1) 이론적 정의


* 코드를 작성할 때, 어떠한 조건을 넣어 결과를 도출하고 싶을 때 유용하게 사용하는 스위프트의 문법입니다. 



2) 문법적 정의 - if ~ else 조건문 

 

 if <#condition#> {

 <#code#>

 }


조건이 트루면 { } 내용 실행, 아니면 else 이하 { } 실행

 

if  #condition#  {

 #statements#

 } else {

 #statements#

 }

 

 * 조건(Condition)은 Bool 값 (true, false) : 다른 언어처럼 0은 False, 1은 True 와 같은 내용은 스위프트에서 지원하지 않습니다.




3) if ~ else 조건문의 다양한 예시



// if 조건문 Exam. 1 if ~ else


var temperatureNow = 30


if temperatureNow <= 32 {

    print("날씨가 따뜻합니다")             <-- (temperatureNow = 30) <= 32 로, 조건을 만족하므로 이 부분이 실행된다.

} else {

    print("날씨가 덥습니다")

}



// if 조건문 Exam. 2 if ~ else if ~ else


temperatureNow = 40


if temperatureNow <= 32 {

    print("날씨가 따뜻합니다")

} else if temperatureNow <= 39 {

    print("날씨가 덥습니다")

} else {

    print("외출을 자제하세요")             <-- (temperatureNow = 40) 으로, '<= 32' 와 '<= 39' 조건에 만족하지 못하므로 이 부분이 실행된다.

}



// if 조건문 Exam. 3 if ~ else if ~ else<-- 마지막 'else' 의 생략


temperatureNow = 45


if temperatureNow <= 32 {

    print("날씨가 따뜻합니다")

} else if temperatureNow <= 39 {

    print("날씨가 덥습니다")

}             // (temperatureNow = 45)는 '<=32', '<=39' 둘 다 만족하지 않음으로 실행 안된다.

              //  사실 이어서 else { } 가 있긴 한데 개발자의 의도에 따라 생략이 된 것이다, 내용이 없는 것으로 보아도 무방합니다. 그래서 아무것도 출력되지 않는다.





Check Swift's Grammar !!!!!


Question 1. if ~ else if 을 1번 사용한 것과 if문을 따로 2번 사용하는 것의 차이점 ?


Answer. 전자는 앞 부분에서 참이면 뒤의 else를 실행하지 않는데, if문을 2번 사용하면 두 번 확인하는 과정이 발생한다.

               구현하고자 하는 로직에 따라서 두 가지 중 하나를 선택해야 한다.




Question 2. if ~ else if 만 있을 때 else 없이 동일하게 처리하려면?


Answer. else if 를 하나 혹은 여러 개 추가하여 모든 조건을 추가해준다.




// 논리 연산자 AND 를 IF문에서는 두 가지 방법으로 나타낼 수 있다.


if (temperatureNow > 0) && (temperatureNow % 2 == 0) {

}                             if (A) && (B) 사용


if temperatureNow > 0, temperatureNow % 2 == 0 {

}                             if a, b 사용






4) 문법적 정의 - Switch 조건문


 switch <#value#>  {

 case <#pattern#>:

    <#code#>

 case <#pattern#>:

    <#code#>

 default:

    <#code#>

 }

 

 * Switch 문은 가능한 모든 사례를 반드시 다루어야 한다.

 * Switch 문은 if ~ else 와 조건을 평가한다는 점에서 유사하지만, switch는 다양하게 경우의 수를 나누어서 조건을 평가할 때 사용하면 유용하다.




// Switch 조건문 Exam 1. Basic


let a : Character = "a"


switch a {

case "a":                                         <--  비교를 해야 하기 때문에 같은 타입을 사용해야 한다.

    print("알파벳의 첫 번째 문자")

   (break)                                         <-- 사실 케이스가 일치하면 스위치 구문은 종료되기 때문에 각 Case 마다 default에 있는 break 가 생략되어 있다고 보면 된다.

case "z":

    print("알파벳의 마지막 문자")

default:                                            <-- 케이스가 모두 맞지 않을 경우 나오는 부분.             

    break                                           <-- break 없으면 오류 발생. 왜냐, 무조건 적어도 하나의 실행 결과가 나와야 한다.

}



* 결과 : case "a" 와 일치하므로 case "a"에 해당하는 코드인 '알파벳의 첫 번째 문자'가 출력된다.




// Switch 조건문 Exam 2. 인터벌 매칭 : 간격을 주어 조건을 평가하는 것을 말한다.


let approxi = 77


switch approxi {

case 0...50:

    print("0 ~ 50")

case 51...100:

    print("51 ~ 100")

default:

    print("기타")

}



* 결과 : case 51...100 에 77이 포함되므로, 이 case의 51 ~ 100 이 출력된다.




// Switch Exam 3. 컴파운드 케이스(Compound Cases) : 조건의 개수를 여러개 입력.


let someCharacter: Character = "e"


switch someCharacter {

case "a", "e", "i", "o", "u":

    print("\(someCharacter) is a vowel")

case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":

    print("\(someCharacter) is a consonant")

default:

    print("\(someCharacter) is not a alphabet")

}



* 결과 : 상수 someCharacter의 값 "e"가 case 1에 일치. 해당 부분 출력




// Switch Exam 4. 벨류 바인딩(value binding) : 좀 더 Swiftable(제가 지어낸 것입니다...) 한 느낌.


let stillAnotherPoint = (9, 0)                                                <-- 이 형식은 Tuple 이라는 자료형이다.


switch stillAnotherPoint {

case (let distance, 0):                                                         <-- 아래 프린트 문에 값을 넣고 싶다. 이럴 때 벨류 바인딩을 써주면 쉽게 가능하다. 'let + 변수명' 

    print("On an axis, \(distance) from the origin")             

default:

    print("Not on an axis")

}



* 위의 구문에서 let distance 를 사용하지 않고 동일하게 출력하기



switch stillAnotherPoint {

case (9, 0):

    print("On an axis, 9 from the origin")

case (0, 9):

    print("On an axis, 9 from the origin")

default:

    print("Not on an axis")                                                     

}                                                                                          <--  케이스 안의 숫자가 바뀌면 다 바꿔줘야 하기 때문에 밸류 바인딩을 사용하는 것이 효율적.



// Switch Exam 5. 디폴트 케이스가 없는 경우(no default case)


let isTrue = true

type(of: isTrue)                                                                    <-- type(of:_) 는 타입을 확인할 수 있는 문법으로 보면 된다.


switch isTrue {

case true:

    print("True")

case false:

    print("false")

default:

    print("Default")                                 <-- 오류가 난다. 왜냐하면 위의 케이스에서 트루와 펄스로 모든 경우가 들어갔기 때문에.

}




// fallthrough


let integerToDescribe = 5

var description = "The number \(integerToDescribe) is"


switch integerToDescribe {

case 2, 3, 5, 7, 11, 13, 17, 19:

    description += " a prime number, and also"

    fallthrough

default:

    description += " an integer"             <-- 쉽게 생각해서 위도 실행시키고 그 다음도 항상 실행시키겠다 하면 'fallthrough' 활용

}

print(description)                                  <-- 결과 : The number 5 is a prime number, and also an integer





5) 문법적 정의 - Guard 조건문


 * if문 vs Guard문

 if <#condition#> {

 <#code#>

 }

 

 guard <#condition#> else {

 <#statements#>

}


* guard 오른쪽의 조건이 false 일 경우에 다음 { } 안의 코드가 실행된다.





// guard Exam 1.


func update1(age: Int) {

    guard 0...100 ~= age else {                                                        <--  guard 조건에 포함되지 않으면 엘스 실행.

        print("else")

        return

    }

    print("Pass")

}


* 아래를 Xcode를 통해 위의 결과를 확인해보세요.

update1(age: 99)

update1(age: 101)




// 아래는 위의 Guard문을 if 문으로 표현한 것입니다...


func update(age: Int) {

    if 0...100 ~= age {                                                                       <-- '~=' : 범위 안에 포함되는지를 확인하는 연산자

        print("OK")

    }

}



* 아래를 Xcode를 통해 위의 결과를 확인해보세요


update(age: 10)




// guard Exam 2.


func update2(age: Int) {

    guard 0...100 ~= age, age == 100 else {                                    <-- guard 조건에 포함되지 않으면 엘스 실행. guard 에서 ','는 'and'를 의미 (if와 동일).

        print("else")

        return

    }

    print("Pass")

}



* 아래를 Xcode를 통해 위의 결과를 확인해보세요


update2(age: 2)

update2(age: -1)

update2(age: 100)







지금까지 조건문에 대해서 알아보았습니다. 틀린 부분이 있으면 댓글로 알려주시면 감사드리겠습니다.


Made by Inswag's Swift in FastCampus 7th iOS Development School

'Programming > Swift' 카테고리의 다른 글

1. Swift : 튜플(Tuple)  (0) 2018.06.02
1. Swift : 반복문(Loops)  (0) 2018.05.23
1. Swift : 접근 제어(Access Control)  (0) 2018.05.22
1. Swift : 함수(function)  (0) 2018.05.16
1. Swift : 타입 변환(Type Conversion)  (0) 2018.05.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함