[ADHD ์๋์ ์ํ VR ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ] ์บก์คํค ์ผ์ง 2 - ๋ํ๋ก ๋๋ฌผํํฐํ .. ์๋ ์คํ ์ด์ผ๊ธฐ โ๏ธ ์ด์ฉ๋ค ๋ ผ๋ฌธ์ ๋ฐ์ ๋ค์์๊น..? ์ฐ๋ฆฌํ์ 1ํ๊ธฐ๋ฅผ ๋๋ฆ ์ด์ฌํ ๋ณด๋๋ค. ์์ผ๋ก ์ผ๋ง๋ ๋ ๋ง์๊ฑธ ํ๊ฒ๋ ์ง ๋ชจ๋ฅธ ์ฒด... ๋งค๋ฒ ์ด๋๊ฐ๋ ์๋ก์ด ์ผ์ด ๊ธฐ๋ค๋ฆฌ๋ ์ฝ๋(me)์ ๋ง๋ ์ด๋ฒคํธ์ ์ถ๋ณต์ด ๋์ด ์๋ ๋ฏ ํ๋ค.. ๋ชจ๋ ๊ฒ์ ๊ต์๋์ด ์ด๋ ๋ ๊ฐ์๊ธฐ ์นดํก์ผ๋ก ๋ ผ๋ฌธ ๋ผ ๊ณณ์ ์๋ ค์ฃผ์ ์๊ฐ๋ถํฐ ์์๋์๋ค. ์ด์ ์ '๋ ผ๋ฌธ ํํธ ์จ์ผ์ฃ ~' ๋ผ๊ณ ํ์์๊ฐ์ ์ด์ผ๊ธฐ๊ฐ ๋์ค๊ธด ํ์์ง๋ง ..ใ ใ ๋ฑ ์ด ์์ ๋ถํฐ ์ฐ๋ฆฌ๋ ๊ฐ๋ฐ์ค์ด๋ ๊ฒ์ ๋ง๋ฌด๋ฆฌ ์ง์ด์ผ ํ๊ณ , ์คํ ์ค๊ณ์ ๋ํ ๊ณ ๋ฏผ์ด ์์ํ์๋ค. ์ ํ์์นด๋ฐ๋ฏธ์์๋ ํ ์ฑ ๊ฐ๋ฐ ํ๋ก์ ํธ๋ฅผ ํ ๋ ์ ์ ํ ์คํธ์ ๋ํด ๋ง์ด ๊ณต๋ถํด๋ณด์๊ธฐ์, ์คํ ์ค๊ณ๋ ๋ด๊ฐ ํ๊ณ ์ถ๋ค๊ณ ๋ง์๋๋ ธ๋ค. VR์ ์ด์ฉํ ์คํ์ ์ฒ์์ด์๊ธฐ ๋๋ฌธ์ ๋ง์ด ์์๋ณด๊ณ , ํ๋กํ ์ฝ์ ์ ๋ง ์ ์ง์ผ๊ฒ ๋ค! ๊ณ .. [ADHD ์๋์ ์ํ VR ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ] ์บก์คํค ์ผ์ง 1 - ์ฐ๋ฆฌํ์ ์๊ฐํฉ๋๋ค ๐ฅ ๐คท๐ปโ๏ธ ๋๋ฉ์ธ ๋น๋ง ๋๊ฐ๋ ๋์ ๋ธ๋ก๊ทธ , ์ ์ด์ ๋์์๋๊ฐ ์๋ ์ฌ๋์ ์๊ฒ ์ง๋ง,, ๋ด ๋ธ๋ก๊ทธ์ ๋๋ฉ์ธ์ kimhaeun.com ์ด๋ค. ์จ์ธ์ ๊นํ์๋๋ค๊ป ,, ์ฃ์กํ์ง๋ง ๋ด๊ฐ ๋ ์ ์ค .... ^^! ์๋ ์ ํ์์นด๋ฐ๋ฏธ ๊ทน ์ด๋ฐ์ SWIFT ๋ด์ฉ์ ์ ๋ฆฌํ๋๊ฒ ๋ง์ง๋ง ๊ธ๋ก ๋จ๋,... ๋ฌด๋ ค 1๋ ๋ฐ๋ง์ ์ด ๋ธ๋ก๊ทธ๋ฅผ ์ผ ๋ค. ๋ด๊ฐ ์ ๋ง ๊ธ๋ก ๋จ๊ฒจ๋๊ณ ์ถ์ ๊ฒ์ด ์๊ฒผ๋๋ฐ, ๊ทธ๊ฑด ๋ฐ๋ก ์ง๊ธ ์กธ์ ๊ณผ์ ๋ก ํ๊ณ ์๋!! ์บก์คํค ๋์์ธ์ ๊ณผ์ ์ด๋ค.! ๐ ์ฐ๋ฆฌํ์ ์๊ฐํฉ๋๋ค ๋ด๊ฐ ์ํ ํ์ ์ด 4๋ช ์ผ๋ก ๊ตฌ์ฑ๋์ด์๋ค. ๐ง๐ป๐ป ๐ง๐ป๐ป ๐ง๐ป๐ป ๐ฉ๐ป๐ป ํ๋๋ํ๊ต ์ด์ํ ๊ต์๋ ๋ฉ์ค (https://sirl.handong.edu/)์ ์์๋์ด ์์ผ๋ฉฐ, ํ์ฌ [ADHD ์๋์ ์ํ V.. [Swift] Cannot convert value of type 'ModelData' to expected argument type 'EnvironmentObject<ModelData>' ์๋ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ฌธ๋ ๊ถ๊ธํด์ก๋ค. envirionmentObject๋ ๊ทธ๋ฅ property์ฒ๋ผ ๋ฃ์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?? struct LandmarkList_Previews: PreviewProvider { static var previews: some View { LandmarkList() .environmentObject(ModelData()) } } ๊ทธ๋์ ์๋ฌ๋ฅผ ํ๋ฒ ๋ง๋ค์ด๋ณด์๋ค. LandmarkList_Previews์์ LandmarkList(modelData: ModelData)๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ @EnvironmentObject ์์ฑ์ ํ๊ฒฝ(environment)์ ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ๊ธฐ ์ํ ์์ฑ(property) ๋ํผ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ๊ฐ์ฒด๋ฅผ ์ง.. [Swift] how to create multiple preview import SwiftUI struct LandmarkList: View { var body: some View { NavigationView { List(landmarks) { landmark in NavigationLink { LandmarkDetail(landmark: landmark) } label: { LandmarkRow(landmark: landmark) } } .navigationTitle("Landmarks") } } } struct LandmarkList_Previews: PreviewProvider { static var previews: some View { ForEach(["iPhone SE (2nd generation)", "iPhone XS Max"], id: \.self) {.. [Swift] ๋ฐ๋ณต๋ฌธ์์ id: \.id ์ ์๋ฏธ 1. id ์์ \. ์ด ๋ถ๋ ์ด์ , ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๋ Key๋ฅผ ์ฐธ์กฐํ๋๋ฒ List(landmarks, id: \.id) { landmark in LandmarkRow(landmark: landmark) } ํ์ง๋ง Landmark ์ฝ๋์ struct Landmark: Hashable, Codable, Identifiable { ๋ค์๊ณผ ๊ฐ์ด Identifiable์ ์ถ๊ฐํด์ฃผ๋ฉด id key path๋ ์ญ์ ํด๋ ๋๋ค. Identifiable ํ๋กํ ์ฝ์ ๊ตฌํํ๋ ๊ฒฝ์ฐ id ํ๋กํผํฐ๋ฅผ ์ง์ ์ง์ ํ์ง ์์๋ List์์ ์์๋ฅผ ์๋ณํ ์ ์๊ฒ ๋์ด, key path๋ฅผ ๋ฐ๋ก ์ง์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค! List(landmarks) { landmark in LandmarkRow(landmark: la.. [Swift] load(_:) method (fetching JSON data) ๋ฏ์ด๋ณด๊ธฐ import Foundation //Create an array of landmarks that you initialize from landmarkData.json. var landmarks: [Landmark] = load("landmarkData.json") func load(_ filename: String) -> T { let data: Data guard let file = Bundle.main.url(forResource: filename, withExtension: nil) else { fatalError("Couldn't find \(filename) in main bundle.") } do { // Data(contentsOf:) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ ๋ด์ฉ์ Data ๊ฐ์ฒด๋ก ์ฝ์ด์จ๋ค... [Swift] Swift ์์ Hashable, Codable์ ๋ญ๊น? Protocol ์์๋ณด๊ธฐ swiftui tutorial ์ ์์ ์ฝ๋๋ฅผ ๊ณต๋ถํ๋ค๋ณด๋ฉด, Struct ๋ค์ ~able ๋ก ๋ถ์ ๊ฒ๋ค์ด ๋ณด์ธ๋ค. ์ด๊ฑด ๋ฌด์์ด๋ฉฐ ๊ฐ๊ฐ ์ด๋ค ์ญํ ์ ํ ๊น? Hashable๊ณผ Codable์ ์ค์ํํธ ์ธ์ด์์ ํ๋กํ ์ฝ(Protocol)์ด๋ค. ์์์ฝ๋์์ ๊ฐ๊ฐ์ ์๋ฏธ 1. Hashable: Hashable ํ๋กํ ์ฝ์ ๊ฐ์ฒด๋ฅผ ๊ณ ์ ํ ํด์๊ฐ์ผ๋ก ๋งคํํ ์ ์๋๋ก ํด์ฃผ๋ ํ๋กํ ์ฝ์ด๋ค. ํด์๊ฐ์ ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ํด์ ํจ์๋ฅผ ํตํด ๊ณ์ฐ๋๋ค. Hashable ํ๋กํ ์ฝ์ ์ฑํํ๋ฉด ํด๋น ๊ฐ์ฒด๋ฅผ Set์ด๋ Dictionary์ ํค๋ก ์ฌ์ฉํ ์ ์๋ค. ๋ํ, Hashable ํ๋กํ ์ฝ์ ์ค์ํ๋ ๊ฐ์ฒด๋ ์งํฉ(Set)๊ณผ ๊ฐ์ ์๋ฃ ๊ตฌ์กฐ์์ ์ค๋ณต๋ ์์๋ฅผ ์ ๊ฑฐํ ์ ์๋ค. Landmark ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๊ฐ Hasha.. [SwiftUI] ํท๊น๋ฆฌ๋ State, Binding, ObservedObject, EnvironmentObject ์ด์ ๋ฆฌ SwiftUI์์์ Single Source of Truth(SSOT, ๋จ์ผ ์ง์ค ๊ณต๊ธ์)๋ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ์ ํ์ฑ์ ์ ์งํ๊ธฐ ์ํ ์ค์ํ ๊ฐ๋ ์ด๋ค. ์ ๋ณด ์์คํ ์ ๋ํ SSOT(Single Source Of Truth) ์ํคํ ์ฒ ๋๋ SPOT(Single Point Of Truth) ์ํคํ ์ฒ๋ ๋ชจ๋ ๋ฐ์ดํฐ ์์๊ฐ ๋ง์คํฐ(๋๋ ํธ์ง)๋๋๋ก ์ ๋ณด ๋ฐ ๋ชจ๋ธ ๊ด๋ จ ๋ฐ์ดํฐ ์คํค๋ง๋ฅผ ๊ตฌ์ฑํ๋ ๊ดํ์ด๋ค. ํ ๊ณณ์์๋ง ์ ๊ท ํ์์ผ๋ก ๋ฐ์ดํฐ ์ ๊ทํ๋ฅผ ์ ๊ณตํ๋ค. ์ด ๋ฐ์ดํฐ ์์์ ๋ํ ๋ชจ๋ ๊ฐ๋ฅํ ์ฐ๊ฒฐ์ ์ฐธ์กฐ์ฉ์ด๋ค. ๋ฐ์ดํฐ์ ๋ค๋ฅธ ๋ชจ๋ ์์น๋ "source of truth" ์์น๋ฅผ ๋ค์ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ์์น์ ๋ฐ์ดํฐ ์์์ ๋ํ ์ ๋ฐ์ดํธ๋ ์ ์ฒด ์์คํ ์ ์ ํ๋์ด ํจ์จ์ฑ/์์ฐ์ฑ ํฅ์, ์๋ชป๋ ๋ถ์ผ์น์ ์ฌ์ด ๋ฐฉ์ง ๊ฐ.. [SwiftUI Tutorials] SwiftUI Essentials - Creating and Combining Views Creating and Combining Views | Apple Developer Documentation This tutorial guides you through building Landmarks — an app for discovering and sharing the places you love. You’ll start by building the view that shows a landmark’s details. developer.apple.com - SwiftUI ์ฑ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ์ฑ์ ์ฑ ํ๋กํ ์ฝ์ ์ค์ํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง. - ์ด ๊ตฌ์กฐ์ body ์์ฑ์ ํ๋ ์ด์์ Scene์ ๋ฐํํ๊ณ ํ์ํ ์ฝํ ์ธ ๋ฅผ ์ ๊ณต. - @main ์์ฑ์ ์ฑ์ entry point๋ฅผ ์๋ณ. - ๊ธฐ๋ณธ์ ์ผ๋ก Swi.. ์ด์ 1 2 3 4 ยทยทยท 7 ๋ค์