기록.

흐름 제어 구문 본문

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)")
    }

}

'Programming > Swift2.0' 카테고리의 다른 글

Swift 기본  (0) 2015.12.09