๐Ÿ“ฑ ์•ฑ ๊ฐœ๋ฐœ ๐ŸŒฑ ์ž…๋ฌธ

Swift iOS ๊ฐœ๋ฐœ

Swift๋กœ iOS ์•ฑ ๊ฐœ๋ฐœ ์ž…๋ฌธ

โฑ๏ธ 15์‹œ๊ฐ„ ๐Ÿ‘๏ธ 22 ์กฐํšŒ
๐Ÿ“– ๊ฐ•์ขŒ ๋‚ด์šฉ
# Swift iOS ๊ฐœ๋ฐœ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

## ํ•™์Šต ๋ชฉํ‘œ
Swift์™€ SwiftUI๋กœ iOS ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค.

## 1. Swift๋ž€?
Apple์ด ๋งŒ๋“  iOS/macOS ๊ฐœ๋ฐœ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.
- ์•ˆ์ „ํ•˜๊ณ  ๋น ๋ฅธ ์„ฑ๋Šฅ
- ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•
- SwiftUI๋กœ ์„ ์–ธ์  UI ๊ฐœ๋ฐœ
- Xcode์—์„œ ๊ฐœ๋ฐœ

## 2. Xcode ์„ค์น˜
App Store์—์„œ Xcode ์„ค์น˜
์ƒˆ ํ”„๋กœ์ ํŠธ > iOS App > SwiftUI ์„ ํƒ

## 3. ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
// ๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜
var name = "Kim" // ๋ณ€์ˆ˜ (๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)
let age = 25 // ์ƒ์ˆ˜ (๋ณ€๊ฒฝ ๋ถˆ๊ฐ€)

// ํƒ€์ž… ๋ช…์‹œ
var score: Int = 100
var price: Double = 19.99
var isActive: Bool = true

// ์˜ต์…”๋„
var email: String? = nil
if let unwrapped = email {
print(unwrapped)
}

// ๋ฐฐ์—ด๊ณผ ๋”•์…”๋„ˆ๋ฆฌ
var fruits = ["Apple", "Banana"]
var person = ["name": "Kim", "age": "25"]

## 4. ํ•จ์ˆ˜
func greet(name: String) -> String {
return "Hello, (name)!"
}

// ๊ธฐ๋ณธ๊ฐ’
func greet(name: String = "Guest") -> String {
return "Hello, (name)!"
}

// ํด๋กœ์ €
let add = { (a: Int, b: Int) -> Int in
return a + b
}

## 5. SwiftUI ๊ธฐ์ดˆ
import SwiftUI

struct ContentView: View {
var body: some View {
Text("Hello, World!")
.font(.title)
.foregroundColor(.blue)
}
}

## 6. ์ƒํƒœ ๊ด€๋ฆฌ
struct CounterView: View {
@State private var count = 0

var body: some View {
VStack {
Text("Count: (count)")
Button("Add") {
count += 1
}
}
}
}

// ๋‹ค๋ฅธ ๋ทฐ์—์„œ ๋ฐ”์ธ๋”ฉ
struct ChildView: View {
@Binding var value: Int
var body: some View {
Button("Increment") { value += 1 }
}
}

// ObservableObject
class UserData: ObservableObject {
@Published var name = ""
}

struct ProfileView: View {
@StateObject var user = UserData()
}

## 7. ๋ ˆ์ด์•„์›ƒ
// ์ˆ˜์ง ์Šคํƒ
VStack(spacing: 20) {
Text("Title")
Text("Subtitle")
}

// ์ˆ˜ํ‰ ์Šคํƒ
HStack {
Image(systemName: "star")
Text("Favorite")
}

// Z ์Šคํƒ (๊ฒน์น˜๊ธฐ)
ZStack {
Color.blue
Text("Overlay")
}

// Spacer
HStack {
Text("Left")
Spacer()
Text("Right")
}

// padding๊ณผ frame
Text("Hello")
.padding()
.frame(width: 200, height: 100)
.background(Color.gray)

## 8. ๋ฆฌ์ŠคํŠธ
struct ListView: View {
let items = ["Apple", "Banana", "Cherry"]

var body: some View {
List(items, id: .self) { item in
Text(item)
}
}
}

// ForEach
List {
ForEach(items, id: .self) { item in
HStack {
Image(systemName: "circle")
Text(item)
}
}
}

## 9. ๋„ค๋น„๊ฒŒ์ด์…˜
struct MainView: View {
var body: some View {
NavigationStack {
List {
NavigationLink("Go to Detail") {
DetailView()
}
}
.navigationTitle("Home")
}
}
}

struct DetailView: View {
var body: some View {
Text("Detail Page")
.navigationTitle("Detail")
}
}

## 10. ๋„คํŠธ์›Œํฌ ์š”์ฒญ
struct Post: Codable {
let id: Int
let title: String
}

func fetchPosts() async throws -> [Post] {
let url = URL(string: "https://api.example.com/posts")!
let (data, _) = try await URLSession.shared.data(from: url)
return try JSONDecoder().decode([Post].self, from: data)
}

// ์‚ฌ์šฉ
struct PostsView: View {
@State private var posts: [Post] = []

var body: some View {
List(posts, id: .id) { post in
Text(post.title)
}
.task {
posts = try? await fetchPosts() ?? []
}
}
}

## 11. ๋กœ์ปฌ ์ €์žฅ
// UserDefaults
UserDefaults.standard.set("Kim", forKey: "username")
let name = UserDefaults.standard.string(forKey: "username")

// @AppStorage
struct SettingsView: View {
@AppStorage("isDarkMode") var isDarkMode = false

var body: some View {
Toggle("Dark Mode", isOn: $isDarkMode)
}
}

## 12. ์•ฑ ๋ฐฐํฌ
1. Xcode > Product > Archive
2. Distribute App ์„ ํƒ
3. App Store Connect ์—…๋กœ๋“œ
4. TestFlight ๋ฒ ํƒ€ ํ…Œ์ŠคํŠธ
5. ์•ฑ ์‹ฌ์‚ฌ ์ œ์ถœ

## ์ถ”์ฒœ ํ•™์Šต ์ˆœ์„œ
1. Swift ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
2. SwiftUI ๋ทฐ ๋งŒ๋“ค๊ธฐ
3. ์ƒํƒœ ๊ด€๋ฆฌ ์ดํ•ด
4. ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌํ˜„
5. API ์—ฐ๋™ ๋ฐ ๋ฐฐํฌ