티스토리 뷰
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
- Swift
- ARC
- commit
- fallthrough
- OOP
- 컨버전
- GCD
- lifecycle
- function
- 프로그래밍
- 스위프트
- var
- ios
- 튜플
- Dictionary
- 깃허브
- 딕셔너리
- 패스트캠퍼스
- 개발스쿨
- 패캠
- swiftUI
- 리터럴
- 열거형
- inswag
- Operator
- fastcampus
- tca
- iOS개발스쿨
- array
- 타입
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |