2014년 12월 22일 월요일

애플의 새로운 개발언어 Swift - 반복문과 제어문 #9

// Playground - noun: a place where people can play

import UIKit

//for문에서 {} 생략할 없는 것에 주의한다.
var str = "Swift"
for ch in str  {
    println(ch)
}

var total = 0
var num = 1

while num <= 100 {
    total += num++
}

println("total: \(total)")

//if문에서 조건식을 감싸는 괄호는 제거되었고 {} 반드시 있어야 한다
var password = "1234abcde"
var specialCharSet = NSCharacterSet.symbolCharacterSet()

if countElements(password)<8 {
    println("password too short")
}
else if password.rangeOfCharacterFromSet(specialCharSet) == nil {
    println("password must have symbol char")
}
else {
    print("password is valid")
}

import Foundation
//switch Swift에서 break 사용하지 않는다
//Objective-C에서는 정수만 비교 가능했지만 지금은 정수, Double, String 가능하다.
var textAlignment = NSTextAlignment.Center

switch textAlignment {
case NSTextAlignment.Left:
     println("left")
case NSTextAlignment.Center:
     println("center")
case NSTextAlignment.Right:
     println("right")
default:
     println("default")
}

//Objective-C 폴쓰루를 지원한다
//비슷하게 Swift에서 구현하려면 아래와 같이 한다
var textAlignment2 = NSTextAlignment.Left

switch textAlignment2 {
case NSTextAlignment.Left:
    println("left")
    fallthrough
case NSTextAlignment.Center:
    println("center")
    fallthrough
case NSTextAlignment.Right:
    println("right")
    fallthrough
default:
    println("default")
}

//문자열 매칭 
//switch구문에서 대소문자를 구분하는 것에 주의한다.
var vendor = "apple"
switch vendor {
    case "APPLE":
        println("iMac")
    case "apple":
        println("iPhone")
    case "google":
        println("Android")
    case "ms":
        println("Windows Phone")
    default:
        println("others...")
}

//튜플 매칭
// _ 사용하면 특정 요소를 패턴 매칭에서 제외할 있다.
var diff = (0, 32)

switch diff {
case (0,0):
    println("no move")
case (_,0):
    println("move horizontally")
case (0,_):
    println("move vertically")
default:
    println("outside screen")
}

// 바인딩을 사용하는 경우
//_문자는 튜플의 특정 요소를 무시하기 때문에 케이스 구문 내부에서 사용하려면
//임시 상수로 대치할 있다
//임시 상수로 대체된 요소는 패턴 매칭에서 제외되지만 요소가 가진 
//값은 임시 상수에 할당되므로 case 내부에서 사용할 있다
//이러한 방식을 바인딩(value binding)이라고 한다.
var diff2 = (30, 0)
switch diff2 {
case (0,0):
    println("no move")
case (let x, 0):
    println("move horizontally: \(x)px")
case (0, var y):
    println("move vertically: \(y)px")
default:
    println("move diagonally")
}

// 바인딩 시에는 default 생략할 있다. 원래는 안되지만 
//이유는 switch 마지막 부분에 바인딩을 통해 앞에서 일치하지 않는 
//모든 패턴을 매칭시킬 있는 case 제공하기 때문이다
var diff3 = (30, 20)
switch diff3 {
case (0,0):
    println("no move")
case (let x, 0):
    println("move horizontally: \(x)px")
case (0, let y):
    println("move vertically: \(y)px")
case (let x, let y):
    println("move \(x)x\(y)")
}

//왼쪽과 오른쪽 방향 구분 
var diff4 = (30, 0)
switch diff4 {
case (0,0):
    println("no move")
case (let x, 0):
    if x<0 {
        println("move left: \(x)px")
    } else {
        println("move right: \(x)px")
    }
case (0, let y):
    println("move vertically: \(y)px")
default:
    println("move diagonally")
}

//조건을 상세하게 지정하는 where 
var diff5 = (30, 0)
switch diff4 {
case (0,0) where diff5.0 < 0:
    println("no move")
case (let x, 0) where x < 0:
    println("move left: \(x)px")
case (let x, 0) where x > 0:
    println("move right: \(x)px")
default:
    println("move diagonally")
}

//새로 도입된 범위 연산자를 사용하는 경우 
var count = 50
switch count {
case 1..<10:
    println("small box")
case 10...30:
    println("medium box")
case 31...100:
    println("big box")
default:
    println("not available")
}

//중첩된 for 반복문 
for outerNum in 1...10 {
    for innerNum in 1...10 {
        if innerNum > 5 {
            break
        }
        println("inner: \(innerNum)")
    }
    println("outer: \(outerNum)")
}

//라벨을 붙여서 사용하는 경우
//바깥쪽 라벨을 지정해서 탈출하기 때문에 5번만 반복하고 종료된다.
OUTER_LOOP: for outerNum in 1...10 {
    INNER_LOOP: for innerNum in 1...10 {
        if innerNum > 5 {
            println("END OUTER")
            break OUTER_LOOP
        }
        println("inner: \(innerNum)")
    }
    println("OUTER: \(outerNum)")
}


댓글 없음:

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.

걸음걸이가 자연스러운 중국산 로봇 영상

인공지능 분야와 로봇 분야에 중국의 기술력이 상당한 파장을 주고 있습니다. 대단합니다. ㅎㅎ    https://www.youtube.com/watch?v=HvG9RIsWpqI