Programming/Swift2.0
흐름 제어 구문
Youngheon
2015. 12. 16. 01:18
반복문, 조건문, 제어 전달문
반복문
기본 for 구문
for var i=0 ; i<10 ; i++{
print("\(i)번째 실행합니다.")
}
for var i=2000 ; i>1980 ; i--{
print("\(i)년")
}
for var i=0 ; ; i++{
if i>=10 {
break
}
}
for ;; {
// 여기에 작성되는 코드는 무한 반복
}
중첩 for 구문
for var i=1 ; i<10 ;i++ {
for var j=1 ; j<10 ; j++{
// 1*1 = 1, 1*2 =2
print("\(i)*\(j) = \(i*j)");
}
}
for ~ in 구문
for row in 1...5{
print("2 * \(row) = \(row*2)")
}
var lang = "swift"
for char in lang.characters {
print("개별 문자는 \(char)입니다.")
}
//루프 상수 생략
let size = 5;
let padChar = "0"
let keyword = "3"
for _ in 1...size {
keyword = padChar + keyword
}
//000003
기본 while 구문
- 실행 횟수가 명확하지 않을 때
- 직접 실행해보기 전까지는 실행 횟수를 결코 알 수 없을 때
- 실행 횟수를 기반으로 할 수 없는 조건일 때
var n = 2
while n < 1000 {
n = n * 2
}
//n = 1024
repeat ~ while 구문
- do ~ while 구문과 비슷
var n = 1024
repeat {
n = n * 2
}
while n < 1000
n // n=2048
조건문 (if, guard, switch)
if 구문
var browser = "Safari"
var browserName : String
if browser=="IE"{
browserName = "인터넷 익스플로러"
} else if browser =="FF" {
browserName = "파이어폭스"
} else if browser = "Opera"{
browserName = "오페라"
} else {
browserName = "알려지지 않은 브라우저";
}
print("사용하고 계신 브라우저는 \(browserName)입니다.")
guard 구문
- guard 구문에는 else 블록이 필수이지만, 표현식의 결과가 참일 때 실행되는 블록은 없다.
- guard 구문은 주로 후속 코드들이 실행되기 전에 반드시 특정 조건을 만족하는지 확인하는 용도로 사용
- 특정 조건을 만족하지 않은 채 후속 코드를 실행하면 심각한 오류가 발생하는 경우, 그 대신 전체 구문을 조기 종료하기 위한 목적으로 사용
- guard 구문이 주로 사용되는 함수나 메소드에서는 return 구문 역할
guard 조건 또는 표현식 else {
실행할 구문(조건 또는 표현식의 결과가 false일 때)
}
func divide(base : Int) {
guard base !=0 else {
print("연산할 수 없습니다.")
return
}
let result = 100 / base
print(result)
}
//Guard를 if 구문으로 대체
func divide(base : int){
if base == 0 {
print("연산할 수 없습니다.")
return
}
let result = 100 / base
print(result)
}
#available 구문
- swift2 부터 지원
//#available 쓰기 전
import UIKit
if UIDevice.currentDevice().systemVersion.hasPrefix("9"){
// ios 9
}else if UIDevice.currentDevice().systemVersion.hasPrefix("9"){
// ios 8
}else{
// 기타
}
if #available(플랫폼 이름 버전, ...,"*){
해당 버전에서 사용할 수 있는 API
}else{
API를 사용하지 못했을 때에 대한 실패 처리
}
if #available(iOS9, OSX 10.10, watchOS 1, *){
// iOS 9 용 API 구문 또는 OS X 10.10 용 API 구문, watchOS 1용 API 구문
}else{
// API를 사용하지 못했을 때에 대한 실패 처리
}
switch 구문
일치하는 비교 패턴이 있을 경우 해당 블록의 실행 코드를 처리한 후 전체 분기문을 종료하고 다음 구문으로 진행
swift는 일치하는 비교 패턴이 여러 개 있더라도 맨 처음 일치하는 Case 구문 하나만 실행
- 그래서 break 문을 사용하지 않음
var val = 2
switch val {
case 1 :
print("1");
case 2 :
print("2");
default :
print("not matching")
}
임시적인 Fall through
let sampleChar : Character = "a"
switch sampleChar {
case "a":
fallthrough // 다른 언어에서는 안적어도 되지만, swift에서는 명시해줘야 한다.
case "A":
print("A")
default :
print("not matching")
}
- 완전한 형식으로 작성 된 switch 구문은 비교 패턴 중 어느 하나와 반드시 일치해야 한다.
- 모든 case 구문을 비교 했음에도 일치된 패턴을 찾지 못했을 경우에 대비하여 default 옵션을 추가해야 한다.
- 모든 패턴을 매칭 되는 구문이 존재 할 경우 default 구문은 생략이 가능하다.
var value = 3
switch value{
case 0,1:
print("0또는 1")
case 2,3:
print("2 또는 3")
default :
print("default")
}
튜플을 임의로 상수나 변수로 받아 처리 가능
var value = (2,3)
switch value{
case let (x,3):
print("튜플의 두 번째 값이 3일 때, 첫번째 값은 \(x)입니다.")
case let (3,y):
print("튜플의 첫 번째 값이 3일 때, 두번째 값은 \(x)입니다.")
case let (x,y):
print("튜플의 값은 각각 \(x), \(y)입니다.")
}
범위 연산자를 사용하여 매칭 처리 가능
//글이 작성된 시간을 범위에 따라 그룹지어 표현
var passTime = 1957
switch passTime {
case 0..<60:
print("방금 작성된 글")
case 60..<3600:
print("조금 전 작성된 글")
case 3600..<86400 :
print("얼마 전 작성된 글")
default :
print("예전에 작성된 글")
}
범위연산자와 튜플 형식으로 이용
var value = (2,3)
switch value{
case (0..<2,3):
print("범위 A에 포함")
case (2..5, 0..<3):
print("범위 B에 포함")
case (2..<5, 3..<5):
print("범위 C에 포함")
default :
print("범위 D에 포함")
}
Where구문 사용
//좌표축의 값을 받아 문장으로 표현 방법
var point = (3,-3)
switch point{
case let(x,y) where x==y :
print("\(x)과 \(y)은 x==y")
case let(x,y) where x==-y :
print("\(x)과 \(y)은 x==-y")
case let(x,y) :
print("\(x)과 \(y)은 일반 좌표상에 있다.")
}
제어 전달문 continue, break, fallthrough, return
continue
이 구문 아래에 있는 실행 구문들을 건너뛰고 다음 반복을 시작
반복문의 조거을 다시 평가하고 그 결과에 따라 다음 반복 실행
//특정 문자 필터링 또는 다른 문자로 변경이 가능
var text = "This is a swift book for Apple's programming language"
var result = "";
for char in text.characters{
switch char{
case " " : //공백
result.append(Character("_"))
continue
case "o" :
result.append(Character("O"))
continue
default :
result.append(char);
}
}
break
switch구문에서 실행흐름이나 반복 실행 중인 루프를 조건식의 결과에 상관 없이 즉각적인 종료
fallthrough
return
구문 레이블
레이블이름 : while 반복 실행을 유지할 조건 {
반복해서 실행할 구문
}
//1~5까지 반복
outer : for i in 1...5{
//1에서 9까지 반복
inner : for j in 1...9{
if(j==3){
break outer
}
print("\(i) * \(j) = \(i*j)")
}
}