← 글 목록

notes

IOS - swift

Swift 문법·타입·옵셔널과 iOS 개발 기본 개념 정리.

Swift 기초 문법 가이드

목차

1. 기본 문법

1.1 변수와 상수

// 변수 선언
var name: String = "홍길동"
var age: Int = 25
var height: Double = 175.5
var isStudent: Bool = true

// 상수 선언
let PI: Double = 3.14159
let MAX_COUNT: Int = 100

// 타입 추론
var score = 95  // Int로 추론
var message = "안녕하세요"  // String으로 추론

1.2 옵셔널

// 옵셔널 선언
var optionalName: String? = "홍길동"
var optionalAge: Int? = nil

// 옵셔널 바인딩
if let name = optionalName {
    print("이름은 \\(name)입니다")
}

// 강제 언래핑 (권장하지 않음)
let forcedName = optionalName!

// 옵셔널 체이닝
let count = optionalName?.count

1.3 컬렉션 타입

// 배열
var numbers: [Int] = [1, 2, 3, 4, 5]
numbers.append(6)
numbers.remove(at: 0)

// 딕셔너리
var person: [String: Any] = [
    "name": "홍길동",
    "age": 25,
    "isStudent": true
]

// 세트
var uniqueNumbers: Set<Int> = [1, 2, 3, 3, 4]  // 중복 제거

2. 객체지향 프로그래밍

2.1 클래스와 구조체

// 클래스
class Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    func introduce() {
        print("안녕하세요, 저는 \\(name)이고 \\(age)살입니다.")
    }
}

// 구조체
struct Point {
    var x: Double
    var y: Double

    func distance(to point: Point) -> Double {
        // 두 점 사이의 거리 계산
        return sqrt(pow(point.x - x, 2) + pow(point.y - y, 2))
    }
}

2.2 프로토콜

protocol Vehicle {
    var numberOfWheels: Int { get }
    func start()
    func stop()
}

class Car: Vehicle {
    var numberOfWheels: Int = 4

    func start() {
        print("자동차가 출발합니다")
    }

    func stop() {
        print("자동차가 정지합니다")
    }
}

3. iOS 개발 필수 개념

3.1 ViewController 생명주기

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // 뷰가 로드될 때 호출
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // 뷰가 나타나기 전에 호출
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // 뷰가 나타난 후 호출
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        // 뷰가 사라지기 전에 호출
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        // 뷰가 사라진 후 호출
    }
}

3.2 Delegate 패턴

protocol DataDelegate: AnyObject {
    func didReceiveData(_ data: String)
}

class DataManager {
    weak var delegate: DataDelegate?

    func fetchData() {
        // 데이터를 가져온 후
        delegate?.didReceiveData("새로운 데이터")
    }
}

class ViewController: UIViewController, DataDelegate {
    let dataManager = DataManager()

    override func viewDidLoad() {
        super.viewDidLoad()
        dataManager.delegate = self
    }

    func didReceiveData(_ data: String) {
        print("받은 데이터: \\(data)")
    }
}

4. 네트워크 통신

4.1 URLSession 사용

func fetchData() {
    guard let url = URL(string: "<https://api.example.com/data>") else { return }

    URLSession.shared.dataTask(with: url) { data, response, error in
        if let error = error {
            print("에러 발생: \\(error)")
            return
        }

        guard let data = data else { return }

        do {
            let json = try JSONSerialization.jsonObject(with: data)
            print("받은 데이터: \\(json)")
        } catch {
            print("JSON 파싱 에러: \\(error)")
        }
    }.resume()
}

4.2 async/await 사용

func fetchData() async throws -> Data {
    guard let url = URL(string: "<https://api.example.com/data>") else {
        throw URLError(.badURL)
    }

    let (data, _) = try await URLSession.shared.data(from: url)
    return data
}

// 사용 예시
Task {
    do {
        let data = try await fetchData()
        // 데이터 처리
    } catch {
        print("에러 발생: \\(error)")
    }
}

5. 실전 예제

5.1 간단한 할 일 목록 앱

struct Todo {
    var title: String
    var isCompleted: Bool
}

class TodoListViewController: UIViewController {
    var todos: [Todo] = []

    func addTodo(_ title: String) {
        let todo = Todo(title: title, isCompleted: false)
        todos.append(todo)
    }

    func toggleTodo(at index: Int) {
        todos[index].isCompleted.toggle()
    }

    func deleteTodo(at index: Int) {
        todos.remove(at: index)
    }
}

참고 자료