제어문이 크게 차이는 없지만 생소하기는 하니 플레이 그라운드를 한 번 실행해서 한 번씩 적어본다.



1. for 문


for var i=0; i<10; i++ {

    print("value of i is \(i)");

}


for index in 1...10 {

    print("index is \(index)")

}


이런 형태를 for-in 문이라고 한다. 어레이 형태의 데이터 셋에서 하나씩 비교하여 값을 읽어들일 수 있다.


var count = 0;

for _ in 1...10 {

    count++;

}


언더바(_)는 반복문에서 참조 변수가 필요하지 않을 경우 넣을 수 있다.



2. while 문


var cnt = 0;

while cnt < 100 {

    ++cnt;

}



3. repeat-while 문


var i = 10;

repeat {

    --i;

}

while (i>0)


응? do-while 문이 안보이네...플레이 그라운드에서 자동으로 repeat-while 문으로 변경된다.


반복문의 제어를 위해서 break와 continue 도 동일하게 적용된다.



4. if 문


var a = 10;

if a>9 {

    print("9보다 크다.")

}


if-else 문은 다음과 같이 사용할 수 있다.

if a<=9 {

    print("9보다 작거나 같다.")

}

else if a>10 {

    print("9보다 크다.")

}


API를 체크하는 기본적인 기능이 담겨 있다. 
특정 API를 체크해서 실행이 필요한 경우가 있는데, 다음과 같이 사용한다. 

if #available(iOS 9, OSX 10.10, *) {

    // Use iOS 9 APIs on iOS, and use OS X v10.10 APIs on OS X

} else {

    // Fall back to earlier iOS and OS X APIs

}



5. switch 문

var j = 10

switch (j) {

    case 10:

        print("값은 10");

    case 20:

        print("값은 20");

    default:

        print("10 20 아니다.");

}


일반적인 스위치문은 동일하다. 다음처럼 범위를 지정할수도 있다.

var j = 10

switch (j) {

case 1...10:

    print("값은 1부터 10 사이");

case 11...20:

    print("값은 11부터 20 사이");

default:

    print("1부터 20 사이의 값이 없다.");

}


범위 설정과 where 문 사용으로 좀 더 유연하게 설정할 수 있다.

switch (j) {

case 1...10 where j%2 == 0:

    print("값은 1부터 10 사이의 짝수");

case 11...20 where j%2 == 0:

    print("값은 11부터 20 사이의 짝수");

default:

    print("1부터 20 사이의 값이 없다.");

}


눈치 챘겠지만 break 문이 없다. 그냥 해당 조건을 만나면 케이스문을 실행하고 스위치 문을 종료한다.
이 break 문을 없앤 일반 스위치문과 동일하게 구현하려면 fallthrough 문을 넣어준다.

switch (j) {

case 1...10 where j%2 == 0:

    print("값은 1부터 10 사이의 짝수")

    fallthrough

case 11...20 where j%2 == 0:

    print("값은 11부터 20 사이의 짝수")

    fallthrough

default:

    break    

}


튜플 데이터를 통해서 스위치문을 비교할 수도 있다.


let somePoint = (1, 1)

switch somePoint {

case (0, 0):

    print("(0, 0) is at the origin")

case (_, 0):

    print("(\(somePoint.0), 0) is on the x-axis")

case (0, _):

    print("(0, \(somePoint.1)) is on the y-axis")

case (-2...2, -2...2):

    print("(\(somePoint.0), \(somePoint.1)) is inside the box")

default:

    print("(\(somePoint.0), \(somePoint.1)) is outside of the box")

}


이렇게 임시 변수에 데이터를 바인딩하여 처리할 수도 있다.


let anotherPoint = (2, 0)

switch anotherPoint {

case (let x, 0):

    print("on the x-axis with an x value of \(x)")

case (0, let y):

    print("on the y-axis with a y value of \(y)")

case let (x, y):

    print("somewhere else at (\(x), \(y))")

}

// prints "on the x-axis with an x value of 2"




그냥 입력하다보니 세미콜론을 찍었다가 안찍었다가 했네...그런데, 에러 메시지가 없이 실행된다.

넣어도 되고 않넣어도 되나보다.



Objective-C를 처음으로 개발을 시작해서 그런지 조금 편하다고 느낀다.


하지만 앞으로는 스위프트를 해야 할 것 같다...만약에 계속 프로그램을 개발하게 된다면 말이다.


첫인상

처음 나왔을 때 간단한 코드를 보고 자바 스크립트 같다고 처음에는 느꼈다. 하지만 자바 스크립트와는 다른 듯...

마침표가 없어서 낯설다. 세미콜론이 있어야 문장이 끝나는 느낌인데...없으니 허전하다.


아무튼 첫인상이 주는 느낌은 간단해보이고 낯선 느낌이었는데, PlayGround를 하나 실행하여 줄줄이 쳐본다.



1. 데이터 타입


부호 있는 정수: Int를 쓰면 된다. (Int8, Int16, Int32, Int64)

부호 없는 정수: Uint를 쓰면 된다. (UInt8, UInt16, UInt32, UInt64)


소수: Float, Double 


부울: Bool (true와 false 값을 가진다)


문자: Character


문자열: String


특수문자: 문자열을 다루고 출력에서 많이 사용하는 특수문자는 다음과 같다.

 - \n: 줄 바꿈

 - \r: 캐리지 리턴

 - \t: 탭

 - \\: 역슬래쉬

 - \": 더블 쿼트

 - \': 싱글 쿼트


대충 이정도면 기본 코딩할 수 있겠다.



2. 변수와 상수


var myVariable = 10

let myConstant = 10


var를 붙이면 변수, let를 붙이면 상수가 된다.



3. 변수 선언 / 할당 / 사용 - 옵셔널(optional)


위에서는 선언과 할당을 같이 했다. 변수의 선언만 하고자 할 때에는 옵셔널 타입(optional type)을 사용한다.

변수명 뒤에 콜론을 찍고, 데이터 타입을 적어주는 것을 타입 어노테이션(Type Annotation)이라고 한다. 


var myVariable: Int?

let myConstant: Int?


이 시점의 변수에는 nil의 값을 가지고 있다. 여기에 값을 할당하여 변수가 값을 가지게 되면 랩핑되었다(wrapped)고 표현한다.


myVariable = 10

myConstant = 10


이 옵셔널 타입의 변수를 사용하면 unwrapped 되지 않았다는 메시지가 뜬다. 


print(myVariable)        // Optional(10) 


언랩핑하기 위해서는 해당 변수 뒤에 !를 붙여서 사용할 수 있도록 해주어야 한다.


print(myVariable!)                      // 10


강제로 언랩핑하는 방법이 하나더 있다. 옵셔널 바인딩(optional binding)을 통해서 할당된 값을 임시 변수나 상수에 할당한다.


if var tmpVariable = myVariable {

    print(tmpVariable)        // 10

}


if let tmpConstant = myConstant {

    print(tmpConstant)        // 10

}


이 옵셔널 바인딩은 우선 지정한 옵셔널 변수나 상수가 값을 가지고 있는 지 먼저 체크한다. 그 뒤에 값이 있을 경우 블럭 안의 코드를 실행하도록 한다.


'그런데, 왜 이래야 하나? 번거롭다.' 라고 생각하던 차에 암묵적인 언래핑(Implicitly unwrapped)이 있었다.


var myVariable: Int!

let myConstant: Int!


그렇다. 그냥 이렇게 !를 붙여서 선언하여 사용하면 변수나 상수를 사용 시에 언랩핑을 해줄 필요 없이 사용할 수 있다.


대충 이정도면 변수와 상수를 다룰 수 있겠다.



4. 신기한 튜플(Tuple)


데이터 타입이 다른 값들을 하나로 묶어서 쓸 수 있는 튜플이 있다.


let myTuple = (2, 2.123, "test")

var myTuple2 = (1, 1.1, "test2")

myTuple2 = (2, 2.1, "changed")        // 값이 변경된다.


해당하는 값을 읽어오려면 어레이처럼 0번 인덱스부터 읽어오면 된다.


print(myTuple.0)            // 2


튜플의 값을 하나 꺼내 비교도 할 수 있다.


if myTuple.0 == myTuple2.0 {

    print("\(myTuple.0)와(과) \(myTuple2.0) 값이 같아요.")        // 2와(과) 2의 값이 같아요.

}



튜플의 값을 일괄적으로 다른 변수에 대입할 수도 있다.


var (myInt, myFloat, myString) = myTuple


특정 값을 제외하고 대입할 수도 있다.  이 때는 해당 항목에 '_'(언더바)를 넣어준다.


var (myInt, _, myString) = myTuple


튜플 생성 시에 각 항목에 이름을 넣어줄 수도 있다. 마치 순서있는 딕셔너리(Ordered Dictionary) 같다.


let myTuple3 = (num: 10, height: 10.123, message: "test")


이 때는 값을 이렇게 읽을 수 있다.


print(myTuple3.0)            // 10

print(myTuple3.num)          // 10



책 10 페이지 정도 읽었는데...일단 이정도. 책은 대충보고 애플 문서를 일독해야 겠다.




+ Recent posts