import
import Foundation
import UIKit // iOS용 프로젝트, 플레이그라운드
import Cocoa // OS X용 플레이그라운드
main
전통적으로 main파일의 main함수에서 애플리케이션이 시작하지만 Swift는 별도의 main함수를 작성하지 않는다. main 소스 코드의 글로벌 영역에서 시작.
세미콜론
Objective-C를 포함한 많은 프로그래밍 언어에서 문장 끝에 세미콜론(;)을 붙이지만 Swift에서는 생략할 수 있다. 단 한 줄에 여러 문장을 작성할 때는 세미콜론으로 구분.
var i = 0; i = 1
공백 문자
공백의 위치에 따라서 연산자를 다르게 인식한다. 일반적인 코드는 다음과 같지만
let i1 = 1 + 2
let i2 = 1+2
한 쪽만 붙여 사용할 경우 단항 연산자로 동작해서 에러를 일으킨다. 에러의 예는 다음과 같다.
let i1 = 1+ 2
let i2 = 1+ 2
그러므로 Swift에서는 공백 문자를 주의한다.
범위 연산자
시작값과 종료값으로 구성된 범위를 정의한다. 닫힌 범위(Closed Range)와 반 닫힌 범위(Half Range) 연산자가 있다.
닫힌 범위 : 1...10 (1~10까지)
반닫힌 범위 : 1..<10 (1~9까지. 종료값은 포함하지 않는다)
변수 및 상수 선언
데이터를 다루기 위해 변수와 상수를 이용한다. 값이 변하는 데이터를 다루려면 변수를 이용하고 변하지 않는 데이터는 상수를 이용한다. 상수에 설정된 값은 변경할 수 없다.
var i = 1 // 변수 선언
var f : Float = 1.0 // 변수 이름 뒤에 :를 붙여 타입을 지정할 수 있다
f = 1.2
let i2 = 1 // 상수 선언
i2 = 3 // error
변수와 상수 초기화
자동으로 초기화되지 않으므로 직접 초기화해야 한다. 초기값이 없는 상태에서 사용하면 에러가 발생한다.
var i : Int
println(i)
// Swift1.2부터 상수의 선언과 초기화 분리 가능
let con : Int
con = 20
데이터 타입
스위프트에서 제공하는 기본 데이터 타입
Character
Bool // true 혹은 false
Int // 부호가 있는 정수형 타입
UInt // 부호가 없는 정수형 타입
Float
Double // 타입을 지정하지 않을 경우 실수형 타입의 기본
String
보통 사용하는 Int타입은 32비트 환경에서 Int32와 같은 크기, 64비트 환경에서 Int64와 같은 크기를 가진다. 데이터타입이 다른 데이터의 크기와 값의 범위는 sizeof()와 max, min 프로퍼티를 이용한다.
sizeof(Int)
Int.max
Int.min
데이터 타입을 변환하는 함수는 타입 이름과 같은 함수를 사용한다. 부울이나 실수 타입의 값을 정수로 변환하려면 Int함수를 사용한다.
var i1 = Int(2.33)
var i2 = Int(false)
같은 정수형 타입에서도 Int8과 Int16은 다른 타입이다. 타입을 섞어서 사용할 경우 에러가 발생한다.
문자와 문자열
Swift에서 문자는 Character를 사용하고 문자열은 String타입을 사용한다. String은 Character의 집합(Collection)이다.
let char1 : Character = "a" // 문자 선언
let string1 : String = "Hello, World!" // 문자열 선언
문자열 안에 다른 문자열 혹은 다른 타입의 변수와 상수를 포함하고 싶을 경우 역슬래쉬 기호와 괄호를 이용한다.
let str1 = "aaa"
let str2 = "hello, \(str1)"
포맷 문자열을 이용해 문자열 객체를 생성할 수 있다. 객체형은 %@를 이용한다.
String(format: "%@ ahahah", arguments: "%@에 들어갈 문자열 객체")
문자열 길이는 count("문자열") 전역 함수를 사용한다.
문자열은 + 연산자를 이용해 덧붙일 수 있으나 Character를 덧붙일 경우 에러가 발생한다.
let char1 :Character = "1"
var str = "senfiw" + char1 // error
문자열 변환
다른 데이터 타입을 문자열로 변경하려면 toString 함수를 이용한다.
var str2 = str + toString(char1)
var strFromInt = toString(11)
var strFromFloat = toString(24.2)
문자열 복사와 비교
Swift 문자열 객체는 밸류 타입이다. 밸류 타입은 새로운 변수에 할당하면 복사되어 새로운 객체가 생성되는 특징이 있다. 즉, 복사할 경우 서로 다른 객체가 된다.
튜플
튜플(tuple)은 괄호를 이용해서 여러 값을 하나로 묶은 것으로 다양한 타입의 값을 다룰 수 있다. 하지만 중요하게 사용하는 데이터는 튜플보다는 구조체나 클래스를 이용하는 것이 좋다.
var one = (1, "one", "일") // 정수와 문자열을 혼합한 튜플
// 튜플값을 얻어온다
one.2 // "일"
one.1 // "one"
// 튜플 항목에 이름 선언
let two = (num : 1, eng : "one", kr : "일")
// 선언한 이름으로 튜플 항목 접근
two.eng // "one"
two.kr // "일"
// 새로운 변수에 대입하여 복사
var second = two
second.eng = "ahah"
second.kr = "koko"
second // (.0 1, .1 "ahah", .2 "koko")
// 튜플을 이용해서 튜플의 값을 얻어오기. 언더스코어(_)를 이용해 값 생략 가능
let (num, _, _) = two
num // 1
배열
다수의 데이터를 순차적인 번호인 인덱스(index)로 다루는 타입이다. 배열에서 값을 얻거나 변경하려면 인덱스를 사용한다.
배열을 선언하려면 타입을 대괄호로 감싼다. let으로 선언할 경우 내용을 변경할 수 없는 배열(Immutable)이 생성된다.
// 배열 선언
var array : [Int] = [1,2,3,4,5]
let array2 = ["a","b","c"]
// 아무 원소도 포함하지 않는 공백 배열 선언
var emptyArray = [Int]()
// 배열의 항목 참조는 첨자 표현식(subscript)을 이용
var e1 = array[0]
// 개수는 count프로퍼티나 count()함수 - Swift1.2 이용
array.count
count(array)
array2.isEmpty // 공백 배열 확인
// 데이터 추가 / 삭제는 +나 .append() 이용. 배열의 마지막 인덱스 뒤에 추가
array.append(6) // [1, 2, 3, 4, 5, 6]
array += [7] // [1, 2, 3, 4, 5, 6, 7]
array[5] // 6
array[6] // 7
// 첨자 표현식을 이용해 배열 항목 변경
array[1...3] = [9,7,6]
array // [1, 9, 7, 6, 5, 6, 7]
딕셔너리
딕셔너리는 키-밸류(key-value) 방식으로 다수의 데이터를 다루는 콜렉션 타입이다. 딕셔너리에 저장된 키는 유일해야 한다. [Key_type, Value_type]으로 정의한다. 데이터에서 타입을 추론할 수 있는 경우 타입 선언이 생략 가능하다.
// 딕셔너리 선언
var dic1 : [String:Int] = ["1월":1, "2월":2]
var dic2 = [1:1, 2:2, 3:3]
// Key값을 이용해 항목 접근
dic1["2월"] // 2
// 저장되어 있지 않는 새로운 키를 이용해 항목 추가
dic1["3월"] = 3
// 키를 이용해 값을 입력하거나 updateValue(forKey:)를 이용해 기존값 변경
dic1["3월"] = 5
dic1.updateValue(7, forKey: "3월")
// nil을 대입하거나 removeValueForKey 메소드를 이용해 항목 삭제
dic1.removeValueForKey("1월")
dic1["2월"] = nil
dic1 // ["3월": 7]
셋(set)
Swift1.2에 셋 타입이 추가됐다. 셋은 배열이나 딕셔너리와 같이 다수의 데이터를 다루는 콜렉션의 하나로, 같은 항목이 없고 순서가 없는 특징이 있다. 대신 속도가 딕셔너리보다 빠르다.
// set정의
var set1 :Set<Int> = [1,2,3,4,5] // {5, 2, 3, 1, 4} 정해지는 순서는 알 수 없다
var set2 = Set<String>() // 공백의 셋 객체 생성
// 항목 추가 및 삭제
set1.insert(6)
set1.remove(5)
// 개수나 항목 포함 여부 확인
set1.count
set1.contains(6) // true
// first 메소드로 첫번째 값을 불러오지만, 어떤 값이 나올지는 알 수 없다.
set1 // {6, 2, 3, 1, 4}
set1.first
// 인덱스를 이용한 접근은 에러 발생
//set1[1] // error
// 개별 항목을 인덱스로 접근하기 위해서는 배열로 변환이 필요
var array = Array(set1)
array // [6, 2, 3, 1, 4]
// For-in을 이용한 반복문 사용
for i in set1{
println(i)
}
// 기존 객체를 추가하면, 기존 객체를 덮어쓴다.
set1 // {6, 2, 3, 1, 4}
set1.insert(6)
set1 // {6, 2, 3, 1, 4}
// 집합 연산 기능(합집합에서 교집합이 2번 되는건 무시했음)
set1.intersect(array) // A 교집합 B
set1.exclusiveOr([2,3]) // A 합집합 B - (A 교집합 B)
set1.union(array) // A 합집합 B
set1.subtract(array) // A - B
기본 제어문
조건(if)
if 조건문에서 조건에는 반드시 Bool 형태의 결과가 나타나도록 조건을 작성해야 한다. 조건을 감싸는 괄호는 생략할 수 있지만 바디의 중괄호는 반드시 작성해야 한다.
// if 조건문 정의
if 3 > 2 {
println("result")
}
//else 및 else if
var type = "c"
if type == "A" {
println()
}
else if type == "b" || type == "d" {
}
else {
println("c")
}
switch
다른 언어와 조금 다르게 동작한다. switch에는 정수 타입 외에도 다양한 타입의 값을 제어식으로 사용할 수 있다. 그리고 제어식 조건에 맞는 첫 case를 하나만 실행하므로 break 문장을 별도로 작성하지 않는다. default는 반드시 작성해야 한다.
// case 정의
var value = 3
switch value {
case 1:
println(1)
default:
println("other") // 모든 정수를 비교하는 case가 없으면 필수 작성
}
// 다수의 값을 나열하거나 범위 연산자
// fallthrough를 이용해 이후 case(다른 언어에서 break를 선언하지 않은 경우) 실행
switch value {
case 1, 2, 5:
println("1, 2 혹은 5")
fallthrough
case 7 ..< 109:
println("7에서 108사이")
default:
println("나머지")
}
// case에 문자열이나 튜플과 같은 값을 사용
// value-binding을 이용해 다양한 형태 패턴 매칭
var value2 = (3, 8)
switch value2 {
case (1, 5):
println()
case (1 ... 3, 6 ..< 8):
println("1~3, 6~7")
case (3, let y):
println("3과 \(y)") // value2
default:
println("other")
}
// where을 이용해 바인딩 조건을 추가 작성
var value3 = (7, 7)
switch value3 {
case (1 ..< 3, 1):
println("(1~3,1)")
case (1, 1 ..< 5):
println("(1,1~4)")
case (4, _):
println("(4, 아무값)")
case (5, let y):
println("(5, y)")
case let (x, y) where x == y:
println("x와 y가 같을 때 (\(x), \(y))") // value3
default:
println("나머지")
}
반복
반복문으로 for나 while문을 사용한다.
// for반복문 정의
for var i = 0; i < 10; i++ {
print(i)
}
// 콜렉션 타입을 이용한 for-in반복문
var str = "12345"
for c in str {
print(c) // 12345
}
// 튜플을 이용해 딕셔너리의 모든 원소 순회
var dic1 : [Int:Int] = [1:1,2:2,3:3]
for (key, value) in dic1 {
print("key : \(key), value : \(value)") // 3번 반복 수행
}
// while과 do-whie(Swift 1.2이하)
var i = 0
while i < 10 {
println("i = \(i++)")
}
do { // Swift 2.0에서 do -> repeat으로 변경(repeat-while)
print("i = \(i--)")
} while i <= 0
댓글