Swift 치트시트
마지막 업데이트
Hello World 및 기초
Swift는 최상위 수준에서 상용구가 필요 없습니다 - 한 줄이면 실행됩니다.
| 작업 | 문법 |
|---|---|
| 한 줄 출력 | print("Hello, World!") |
| 줄바꿈 없이 출력 | print("Hi", terminator: "") |
| 문자열 보간 | print("Hi \(name)") |
| 주석 | // this is a comment |
| 여러 줄 주석 | /* ... */ |
| 모듈 임포트 | import Foundation |
| 파일 실행 | swift run 또는 swift main.swift |
변수 (let / var) 및 타입
상수에는 let, 가변 값에는 var를 사용하세요. 타입은 보통 추론됩니다.
| 작업 | 문법 |
|---|---|
| 상수 | let age = 30 |
| 변수 | var count = 0 |
| 명시적 타입 | let name: String = "Ada" |
| 기본 타입 | Int, Double, String, Bool, Character |
| 타입 변환 | Double(i), String(n), Int("42") |
| 튜플 | let pair = (1, "a") |
| 타입 별칭 | typealias ID = Int |
| 타입 확인 | value is String, value as? String |
옵셔널
옵셔널은 값이 없을 수도 있음을 모델링합니다. 사용하기 전에 언래핑하세요.
| 작업 | 문법 |
|---|---|
| 옵셔널 선언 | var name: String? = nil |
| 옵셔널 바인딩 | if let n = name { ... } |
| guard 언래핑 | guard let n = name else { return } |
| nil 병합 | let n = name ?? "default" |
| 옵셔널 체이닝 | user?.address?.city |
| 강제 언래핑 (안전하지 않음) | name! |
| 암묵적 언래핑 | var name: String! |
| 옵셔널에 map | name.map { $0.count } |
문자열
문자열은 완전한 유니코드를 지원하는 값 타입입니다.
| 작업 | 문법 |
|---|---|
| 길이 | s.count |
| 대문자 / 소문자 | s.uppercased(), s.lowercased() |
| 연결 | "foo" + "bar" |
| 보간 | "Total: \(price)" |
| 포함 여부 | s.contains("ell") |
| 접두사 / 접미사 여부 | s.hasPrefix("he") |
| 분할 | s.split(separator: ",") |
| 치환 | s.replacingOccurrences(of: "a", with: "b") |
| 여러 줄 문자열 | """ ... """ |
컬렉션 (Array, Dictionary, Set)
세 가지 핵심 컬렉션 타입으로, 모두 값 타입입니다.
| 작업 | 문법 |
|---|---|
| 배열 리터럴 | var nums = [1, 2, 3] |
| 추가 | nums.append(4) |
| 접근 / 개수 | nums[0], nums.count |
| map / filter | nums.map { $0 * 2 }, nums.filter { $0 > 1 } |
| 딕셔너리 리터럴 | var ages = ["Ada": 30] |
| 딕셔너리 접근 | ages["Ada"]는 옵셔널을 반환 |
| 셋 리터럴 | var ids: Set = [1, 2, 3] |
| 셋에 삽입 | ids.insert(4) |
| 딕셔너리 순회 | for (k, v) in ages { ... } |
제어 흐름
조건에는 괄호가 필요 없으며, switch는 모든 경우를 빠짐없이 다뤄야 합니다.
| 작업 | 문법 |
|---|---|
| if / else | if x > 0 { ... } else { ... } |
| 삼항 연산자 | let r = x > 0 ? "pos" : "neg" |
| switch | switch n { case 1: ...; default: ... } |
| 범위가 있는 switch | case 1...5: ... |
| for-in 반복문 | for i in 0..<10 { ... } |
| 배열 순회 for-in | for item in items { ... } |
| while 반복문 | while x < 100 { ... } |
| repeat-while | repeat { ... } while x < 100 |
| break / continue | break, continue |
함수 및 클로저
함수에는 레이블이 붙은 매개변수가 있고, 클로저는 독립적인 코드 블록입니다.
| 작업 | 문법 |
|---|---|
| 함수 정의 | func add(a: Int, b: Int) -> Int { a + b } |
| 외부 레이블 | func greet(to name: String) { ... } |
| 기본 매개변수 | func greet(name: String = "World") { ... } |
| 가변 인자 매개변수 | func sum(_ nums: Int...) -> Int { ... } |
| 여러 반환값 (튜플) | func bounds() -> (min: Int, max: Int) { ... } |
| 클로저 표현식 | let f = { (x: Int) -> Int in x * x } |
| 후행 클로저 | nums.map { $0 * 2 } |
| 축약 인자 | { $0 + $1 } |
구조체 vs 클래스
구조체는 값 타입(복사됨)이고, 클래스는 참조 타입(공유됨)입니다.
| 작업 | 문법 |
|---|---|
| 구조체 정의 | struct Point { var x: Int; var y: Int } |
| 클래스 정의 | class Person { var name: String } |
| 클래스 초기화자 | init(name: String) { self.name = name } |
| 인스턴스 생성 | let p = Point(x: 1, y: 2) |
| 변경 구조체 메서드 | mutating func move() { x += 1 } |
| 클래스 메서드 | func greet() { ... } |
| 상속 (클래스 전용) | class Student: Person { ... } |
| 계산 프로퍼티 | var area: Int { width * height } |
| 정적 멤버 | static let shared = Manager() |
열거형
열거형은 관련 값을 묶으며 연관 데이터를 담을 수 있습니다.
| 작업 | 문법 |
|---|---|
| 열거형 정의 | enum Direction { case north, south } |
| 케이스 사용 | let d = Direction.north |
| 열거형에 switch | switch d { case .north: ... } |
| 원시 값 | enum Status: Int { case ok = 200 } |
| 원시 값 접근 | Status.ok.rawValue |
| 원시 값으로 초기화 | Status(rawValue: 200) |
| 연관 값 | case result(Int, String) |
| 열거형의 메서드 | func label() -> String { ... } |
가장 자주 쓰는 Swift 문법을 한 페이지에 담았습니다. 이 Swift 치트시트는 언어 핵심을 위한 빠른 참조 자료입니다 - 상수와 변수, 옵셔널, 문자열, 컬렉션, 제어 흐름, 함수와 클로저, 그리고 iOS와 macOS 앱을 만드는 데 쓰는 구조체, 클래스, 열거형을 다룹니다.
여기 나오는 모든 내용은 표준 Swift이며 공식 툴체인으로 컴파일됩니다. 필요한 것을 복사하거나, Swift 플레이그라운드에서 모든 코드를 바로 실행해 보세요 - Xcode가 필요 없습니다.
Swift 치트시트 자주 묻는 질문
이 Swift 치트시트는 무료인가요?
Swift에서 옵셔널을 어떻게 언래핑하나요?
nil일 수 있으므로, 사용하기 전에 언래핑합니다. 안전한 방법으로는 옵셔널 바인딩(if let n = name { ... }), 함수 상단의 guard let, nil 병합 연산자(name ?? "default"), 옵셔널 체이닝(user?.name)이 있습니다. name!을 사용한 강제 언래핑은 동작하지만 값이 nil이면 충돌하므로, 확신할 때만 사용하세요.Swift에서 구조체와 클래스의 차이는 무엇인가요?
struct는 값 타입입니다: 대입하거나 전달하면 복사되므로 변경이 원본에 영향을 주지 않습니다. class는 참조 타입입니다: 복사본이 같은 인스턴스를 공유하며, 클래스만 상속을 지원합니다. 애플의 권장 사항은 기본적으로 구조체를 선호하고, 공유 가변 상태나 상속이 필요할 때 클래스를 사용하는 것입니다.