iOS ๐ŸŽ

์ฐธ๊ณ  ์‚ฌ์ดํŠธ ๋ฐ ์ถœ์ฒ˜ https://www.youtube.com/watch?v=ZQXzZ1hxQwo ์œ„ ์›๋ณธ ์˜์ƒ์„ ์ฐธ๊ณ  ํ•˜์‹œ๋ฉด ๋” ์ž์„ธํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์œ„ ์˜์ƒ์ด ์žˆ์–ด ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ๊ณต๋ถ€ํ•˜๋‹ค ์•Œ๊ฒŒ๋œ ์ ๋งŒ ์ ์–ด ๋†“์•˜์Šต๋‹ˆ๋‹ค. NavigationLink NavigationLink๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ์„ ์Œ“์„ ์ˆ˜ ์žˆ์Œ NavigationView { VStack { NavigationLink(value: , label: View#>) } .padding() } value ๋Š” ์ด๋™ ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋งํฌ๋ฅผ ๊ฑธ ๋ทฐ, label์€ ์Šคํƒ์œผ๋กœ ์Œ“์„ ๋ทฐ๋ฅผ ํด๋กœ์ €๋กœ ์ „๋‹ฌ NavigationView { VStack { NavigationLink { Text("๋‘ ๋ฒˆ์งธ ๋ทฐ") } label: { Text("์ฒซ ๋ฒˆ์งธ ๋ทฐ") ..
TextField keyboardType modifier๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ฐ›๋Š” ํ‚ค๋ณด๋“œ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ TextField("ํ…Œ์ŠคํŠธ") .keyboardType(.asciiCapable) ์˜๋ฌธ, ์ˆซ์ž, ํŠน์ˆ˜ ๋ฌธ์ž ์ž…๋ ฅ๋งŒ ๊ฐ€๋Šฅํ•จ (ํ•œ๊ธ€, ์ด๋ชจํ‹ฐ์ฝ˜ ๋ถˆ๊ฐ€ ์•„์Šคํ‚ค๋งŒ ๊ฐ€๋Šฅ) ์ˆซ์ž ๋ฐ ๊ตฌ๋‘์  default๋กœ ์ˆซ์ž์™€ ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ ํ•œ๊ธ€๊ณผ ์˜์–ด ์ž…๋ ฅ ๊ฐ€๋Šฅ ์‚ฌ์šฉ์ž๊ฐ€ URL์„ ์ž…๋ ฅํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๋‹จ์— ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ์ œ๊ณตํ•จ ์ˆซ์ž๋งŒ ์ž…๋ ฅ ๊ฐ€๋Šฅ ์†Œ์ˆ˜์  ์ž…๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ˆซ์ž์™€ decimal point ์ œ๊ณต ์ˆซ์ž ํ‚ค๋ณด๋“œ์™€ ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ ์ž…๋ ฅ์‹œ ์‚ฌ์šฉ๋˜๋Š” ํŠน์ˆ˜ ๋ฌธ์ž ์ œ๊ณต ์ด๋ฆ„๊ณผ ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ ์ž…๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋‘ ๊ฐ€์ง€ ํ‚ค๋ณด๋“œ๋ฅผ ์ œ๊ณตํ•จ (์ด๋ชจ์ง€, ์˜์–ด ๊ฐ€๋Šฅ) ์ด๋ฉ”์ผ ์ฃผ์†Œ ์ž…๋ ฅ์— ์‚ฌ์šฉ๋˜๋Š” @์™€ . ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ํ•˜๋‹จ์— ๋ฐฐ์น˜ํ•œ ํ‚ค๋ณด๋“œ ..
Info.plist contained no UIScene configuration dictionary ํ”„๋กœ์ ํŠธ > Targets > Info.plist > Custom iOS Target Properties > Application Scene Manifest์—์„œ Scene Configuration ์„ ์ถ”๊ฐ€ํ•ด ์ฃผ๋ฉด ๋จ
TextField๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ String ํƒ€์ž…์„ Binding ํ•  ์ˆ˜ ์žˆ์Œ TextField("๊ฐ’์„ ์ž…๋ ฅํ•˜์„ธ์š”", text: ) String์ด ์•„๋‹Œ ํƒ€์ž…์„ Bindingํ•˜๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฐœ์ƒํ•จ. ์ด๋•Œ format์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ์˜ ํƒ€์ž…์„ ๋ฐ”๊ฟ”์ฃผ์ง€ ์•Š๊ณ ๋„ ํ…์ŠคํŠธ ํ•„๋“œ์— ๊ฐ’์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Œ ใ„ด checkAmount ๊ฐ’์ด double์ด๊ธฐ ๋•Œ๋ฌธ์— TextField์˜ text ์ธ์ž์— Binding์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฐœ์ƒํ•จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ TextField( "Proper name", value: $nameComponents, format: .name(style: .medium) ) ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์œผ๋กœ ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ ์ €์žฅํ•  ํ”„๋กœํผํ‹ฐ๋ฅผ value๋กœ ์ „๋‹ฌํ•˜๊ณ  format ํ˜•์‹์„ format ์ธ์ž๋กœ ์ „๋‹ฌ..
ForEach array, ranges์™€ ํ•จ๊ป˜ ๋ฐ˜๋ณต ์ž‘์—…์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ ํด๋กœ์ ธ๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋˜๋ฉฐ loop์˜ ๋ชจ๋“  ์•„์ดํ…œ์„ ํ•œ๋ฒˆ์”ฉ ์ˆœํ™˜ํ•˜๊ฒŒ ๋จ class test { init() { let titles = ["a", "b", "c", "d", "e"] self.loopAllItems(items: titles) } func loopAllItems(items: [String]) { items.forEach { print($0) } } } ForEach๋Š” ๊ธฐ์กด์— Swift์—์„œ ์‚ฌ์šฉํ•œ ๊ณ ์ฐจ ํ•จ์ˆ˜ forEach์™€ ๋™์ž‘๊ณผ ์‚ฌ์šฉ๋ฒ•์ด ๊ฐ™์Œ ScrollView { ForEach(0 ..< 100) { Text("\($0)") } } ForEach๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ˜๋ณต๋˜๋Š” ๋ทฐ๋ฅผ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ ํ™”๋ฉด์— ๊ทธ๋ ค ์ค„ ์ˆ˜..
๋‹ฌ๋Ÿฌ์‚ฌ์ธ์€ two-way binding์„ ํ•  ๋•Œ ์‚ฌ์šฉ๋จ Text("๋‹น์‹ ์˜ ๋‚˜์ด๋Š” : \(age)") Text์˜ ๊ฒฝ์šฐ ํ”„๋กœํผํ‹ฐ์˜ ์ƒํƒœ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์คŒ TextField์˜ ๊ฒฝ์šฐ text๋ผ๋Š” ์ธ์ž์— ํ•„์š”ํ•œ ๊ฐ’์ด Binding two-way binding์€ ํ”„๋กœํผํ‹ฐ์˜ ์ƒํƒœ ๊ฐ’์„ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋ฉด์„œ ํ•ด๋‹น ์ƒํƒœ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ , ๊ทธ ์—…๋ฐ์ดํŠธ ํ•œ ๊ฐ’์„ ๋‹ค์‹œ ํ™”๋ฉด์— ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Œ struct ContentView: View { @State private var age = "" var body: some View { VStack { TextField("๋‚˜์ด๋ฅผ ์ž…๋ ฅํ•˜์‹œ์˜ค.", text: $age) Text("๋‹น์‹ ์˜ ๋‚˜์ด๋Š” : \(age)") }.padding() } } two-way binding์€ ํ”„๋กœํผํ‹ฐ ๋ฐ”๋กœ ์•ž์— ..
์˜ˆ์‹œ ์ฝ”๋“œ struct ContentView: View { @State private var count = 0 @State private var isOne = false var body: some View { VStack { Button("๋ฒ„ํŠผ ๋ˆŒ๋ฆฐ ํšŸ์ˆ˜ \(count)") { self.count += 1 } Toggle(isOn: $isOne) { Text("ํ† ๊ธ€ ์ƒํƒœ \(isOne ? "on" : "off")") } } } } SwiftUI์—์„œ View ๋‹จ์œ„์˜ ๊ฐ„๋‹จํ•œ ๊ฐ’์„ State๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์ด๋•Œ Button์€ State์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด self๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Toggle์€ ๋‹ฌ๋Ÿฌ ์‚ฌ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์•Œ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์‹ค ๊ฐ๊ฐ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ๋•Œ ์—ญํ• ๊ณผ ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. State์˜ ๊ฐ’..
Intro ํ˜„์žฌ ๋ทฐ์—์„œ ๋ณด์—ฌ์ง€๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ State๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ. ์ด ์ƒํƒœ์— ์˜ํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” UI๋ฅผ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ views are a function of their state ๋ผ๊ณ  ํ•˜๊ธฐ๋„ ํ•จ (์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๊ธฐ ์ „๊นŒ์ง€ ๋ฒ„ํŠผ์„ ๋น„ํ™œ์„ฑํ™” ์‹œํ‚ค๋Š” ๊ฒƒ๋„ state๋“ค์— ์˜ํ•ด ๋ทฐ๊ฐ€ ๊ด€๋ฆฌ๋˜๋Š” ๊ฒƒ) SwiftUI๋Š” struct๋กœ ๊ตฌํ˜„๋œ view๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Swift์™€ UIKit์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋‹จ์ˆœํžˆ property๋ฅผ ์„ ์–ธํ•œ ๋’ค ๊ตฌ์กฐ์ฒด ์•ˆ์—์„œ ๊ทธ ๊ฐ’์„ ๋ฐ”๊ฟ€์ˆ˜ ์—†์Œ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ State๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ€์ง„ property wrapper๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ SwiftUI๋Š” ๋ทฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ์ผ์„ ์ž์ฃผ ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ทฐ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์— ๋Œ€ํ•ด ๋‹จ์ˆœํ•˜๊ฒŒ..