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


댓글 없음:

댓글 쓰기

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

5월 14일 새벽에 chatGPT 4o가 발표되었습니다. 옵티마이즈, 옴니라는 의미인데 실시간 통역, 다자간 회의, 멀티모달 기능의 강화등이 보이네요.

  초격차로 OpenAI진영이 다시 앞서가는 모양을 보여주고 있습니다. 저도 새벽에 일어나자 마자 올라온 영상들과 글을 정리하고 있습니다. ㅎㅎ 영화 HER의 사진이 새벽에 많이 올라왔었는데 저도 안본 영화입니다. 주말에 한번 봐야 할 것 같습니다....