์ธ๋„ค์ผ [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..