HACKING WITH SWIFT - WeSplit(2)
π§π»μ΄μ μκ°μ μ΄μ΄μ μ΄λ² μκ°μλ λμΌνκ² κ³μ μ§νν΄λ³΄κ² μ΅λλ€~!
1. μν μμ
κ²μμ νλ€λ³΄λ©΄ μΊλ¦ν°μ λͺ©μ¨μ λͺ κ° μμ μλ μκ³ μ μλ₯Ό μ»λλ€λμ§ νλ κ²½μ°κ° μλ€. μ΄κ±Έ μ°λ¦¬λ νλ‘κ·Έλλ°μ μμ΄μ "μν"λΌκ³ λΆλ₯΄λλ°
struct ContentView: View {
var tapCount = 0
var body: some View {
Button("Tap Count: \(tapCount)") {
tapCount += 1
}
}
}
μ½λλ₯Ό 보면 λ±ν λ¬Έμ κ° μμ΄ λ³΄μΈλ€. κ·Όλ° μ΄ μ½λλ μ€μ λ‘λ λΉλ λμ§ μλλ° μ΄μ λ ContentViewλ μμλ‘ μμ±λ μ μλ ꡬ쑰체μ΄λ€. μμ μ°λ¦¬κ° λ°°μ΄ κ΅¬μ‘°μ²΄ ννΈλ₯Ό κΈ°μ΅ν΄λ³΄λ©΄ 그건 μλ λ³νμ§ μλ κ²μ΄μλ€.
μ°λ¦¬κ° νΉμ±μ λ³κ²½ν λ €λ ꡬ쑰체 λ©μλλ₯Ό μμ±ν λ mutationg ν€μλλ₯Ό μΆκ°ν΄μΌ νλ€.
μ°λ¦¬μ λͺ©μ μ λ²νΌμ ν°μΉ ν λλ§λ€ 1μ© μ¦κ°νκ² νλ‘κ·Έλλ°νλ κ²μ΄ λͺ©μ μ΄μμλλ° Viewκ° κ΅¬μ‘°μ²΄μ΄κΈ° λλ¬Έμ Swiftκ° κ·Έκ±Έ νμ©ν΄μ£Όμ§ μμκΈ° λλ¬Έμ μλΉν κ³€λν΄μ§ μν©μ΄λ€.
μ΄λ° μν©μμ Swiftλ μμ± λνΌ(property wrapper)λΌκ³ νλ νΉλ³ν ν΄λ΅μ μ 곡νλλ° μμ±μ ν¨κ³Όμ μΌλ‘ λ₯λ ₯μ λΆμ¬νλ νΉμ μμ±μ΄λ€. κ·Έλμ νμ¬ μν©μμλ @StateλΌλ μμ± λνΌλ₯Ό μ¬μ©νκ² λλ€.
struct ContentView: View {
@State var tapCount = 0
var body: some View {
Button("Tap Count: \(tapCount)") {
self.tapCount += 1
}
}
}
κ΅¬μ‘°μ²΄κ° κ³ μ λμ΄μκΈ° λλ¬Έμ μμ±μ λ³κ²½ ν μ μλ€λ κ²μ μκ³ μμ§λ§ @Stateμ μ΄μ©νλ©΄ ν΄λΉ κ°μ μμ κ°λ₯ν μμΉμ λ³λλ‘ μ μ₯ν μ μκ² λλ€. λ°λΌμ @Stateλ₯Ό μ΄μ©νμ¬ κ΅¬μ‘°μ²΄μ νκ³λ₯Ό ν΄κ²°ν μ μλ€.
2. μ¬μ©μ μΈν°νμ΄μ€ 컨νΈλ‘€μ μν λ°μΈλ© νκΈ°
μ΄μ μλ @Stateλ₯Ό μ΄μ©νμ¬ κ΅¬μ‘°μ²΄μ νκ³λ₯Ό ν΄κ²°νλ λ°©λ²μ λν΄μ μμ보μλλ° μ΄λ²μλ μ¬μ©μκ° μ λ ₯ν μμλ νΈμ§ κ°λ₯ν ν μ€νΈ νλλ₯Ό λ§λ€μ΄ 보μ.
struct ContentView: View {
var body: some View {
Form {
TextField("Enter your name")
Text("Hello, world!")
}
}
}
μ μ΄λ κ² ν΄λ³΄λ©΄ λ κ³Όμ° μλ κΉ? κ·Έλ΄λ¦¬κ° μλ€. SwiftUIλ ν μ€νΈ νλμμ ν μ€νΈλ₯Ό μ μ₯ν μμΉλ₯Ό μκ³ μΆμ΄ νκΈ° λλ¬Έμ ν΄λΉ μ½λλ μ μμ μΌλ‘ μ»΄νμΌλμ§ μλλ€. κ·ΈλΌ μ΄κ²λ μκΉμ λΉμ·νκ² μμ μ ν΄λ³΄μ.
ν μ€νΈ νλμ κ²½μ°μ ν μ€νΈμ μλ λͺ¨λ λ΄μ©μ΄ name μμ±μλ ν¬ν¨ λμ΄μλμ§ νμΈμ ν΄μΌ νλ€. μ¦, μ¬μ©μκ° λ³Ό μ μλ λͺ¨λ κ²μ μ½λμμ ꡬ쑰체μ μμ±μ κ°μμ νν!! μ΄κ²μ μ°λ¦¬λ μλ°©ν₯ λ°μΈλ©μ΄λΌκ³ νλ€.
ν μ€νΈ νλλ₯Ό λ°μΈλ© νμ¬ μμ± κ°μ νμ νμ§λ§ ν μ€νΈ νλλ₯Ό μμ νλ©΄ μμ±λ μ λ°μ΄νΈνλλ‘ λ°μΈλ©νλ€λ κ²μ΄λ€.
κ·Έλμ μλ°©ν₯ λ°μΈλ©μ ν λ νΉμ κΈ°νΈμΈ $λ₯Ό μ¬μ©νμ¬ μμ±κ°μ μ½κ³ λ³κ²½ μ¬νμ΄ λ°μνλ©΄ λ€μ μ¨μΌ νλ€κ³ Swiftμκ² μλ €μ£Όλ μν μ νλ€. μ΄μ λͺ¨λ μ 리λ λλ¬μΌλ μ½λλ‘ νλ² μ 리ν΄λ³΄μ.
struct ContentView: View {
@State private var name = ""
var body: some View {
Form {
TextField("Enter your name", text: $name)
Text("Your name is \(name)")
}
}
}
3. Viewμμ λ°λ³΅μ¬μ©
View λ΄μμ λ°λ³΅λ¬Έμ μ¬μ©νλ κ²½μ°λ μκ°λ³΄λ€ λ§λ€. μλ₯Ό λ€λ©΄ μ΄λ¦ λ°°μ΄μ λ°λ³΅μ μΌλ‘ 보μ¬μ£Όκ±°λ λ©λ΄ νλͺ© λ°°μ΄μ μμ±ν λκ° κ·Έλ λ€. SwiftUIλ μ΄λ¬ν λͺ©μ μ μν΄ ForEachλ₯Ό μ¬μ©νκ² λλλ° μ΄κ±΄ λ°°μ΄κ³Ό λ²μλ₯Ό λ°λ³΅ν΄μ νμν λ§νΌ Viewλ₯Ό μμ±ν μ μλ€.
λν ForEachλ₯Ό μ¬μ©νλ©΄ 10κ°μ λ·° μ ν λν μλ€.
λ°λ‘ μ¬μ©ν΄λ³΄μλ©΄
Form {
ForEach(0..<100) { number in
Text("Row \(number)")
}
}
ForEachλ λν SwiftUIλ‘ μμ ν λ νΉν μ μ©νλ°, Pickerμ ν¨κ» μ¬μ©νλ©΄ μ¬μ©μκ° μ νν μ μλ λ€μν μ΅μ μ νμν μ μλ€.
κ·Έλμ μ΄κ±Έ λ°λ‘ μμλ‘ λ³΄κΈ° μν΄ μλμ κ°μ Viewλ₯Ό μ μν΄λ³΄μ
- νμ μ΄λ¦μ λν λ°°μ΄μ΄ μλ€.
- νμ¬ μ νν νμμ μ μ₯νλ μμ±μΈ @Stateλ₯Ό μ΄μ©νλ€.
- μ¬μ©μμ λν μλ°©ν₯ λ°μΈλ©μ μ¬μ©νμ¬ μ¦κ²¨μ°ΎκΈ°λ₯Ό μ ννλλ‘ Picker viewλ₯Ό μμ±νλ€.
- ForEachλ₯Ό μ¬μ©νμ¬ κ°λ₯ν λͺ¨λ νμ μ΄λ¦μ λ°λ³΅νμ¬ Text Viewλ‘ λ°κΎΌλ€.
struct ContentView: View {
let students = ["Harry", "Hermione", "Ron"]
@State private var selectedStudent = "Harry"
var body: some View {
NavigationView {
Form {
Picker("Select your student", selection: $selectedStudent) {
ForEach(students, id: \.self) {
Text($0)
}
}
}
}
}
}
μ¬κΈ°μ μ§κ³ λμ΄κ°μΌ νλ κ² λͺ κ°μ§λ§ λ μ΄ν΄λ³΄μ.
- selectedStudent μμ±μ Harryκ°μΌλ‘ μμνμ§λ§ μ΄ν μ¬μ©μμ μν΄ λ³κ²½λ μ μκΈ° λλ¬Έμ @Stateλ₯Ό μ¬μ©νλ€.
- Pickerλ μ΄λΈμ ν΅ν΄ νμ μ νν μ μλ€.
- Pickerμ selectedStudent μ¬μ΄μ μλ°©ν₯ λ°μΈλ©μ΄ μλ€. μμ λ§νλ― μ¬μ©μμ μν΄ κ°μ΄ λ³κ²½λ μ μκΈ° λλ¬Έμ΄λ€.
μ¬κΈ°μ μ‘°κΈ μ΄λ €μ λ λΆλΆμ ForEach(students, id: \. self)λ‘ SwiftUIκ° νλ©΄μ λͺ¨λ viewλ₯Ό κ³ μ νκ² μλ³ν μ μμ΄μΌ νλ―λ‘ μν©μ΄ λ³κ²½λ λ κ°μ§ν μ μκ² νκΈ° μν΄ μ‘΄μ¬νλλ° \. selfκ° μλ―Ένλ λ°λ λ¬Έμμ΄ μμ²΄κ° κ³ μ νλ€λ κ²μ μλ―Ένλ€.
κΈ΄κ°λ―Όκ°νκ² λ°°μ μ λ§€νμ§λ§ μ΄ν μμΈν λ΄μ©μ μ΄ν νλ‘μ νΈλ₯Ό μ§νν΄λ³΄λ©΄μ μ°¨κ·Όμ°¨κ·Ό λ€μ ν΄λ³΄μ!!
learning by repetition