간단히 테스트 하려고 코드를 가운데 3줄 집어넣었어요.
이 코드는 동작할까요...?!
import SwiftUI
struct ProfileEditor: View {
@Binding var profile : Profile
var dateRange : ClosedRange<Date>{
let min = Calendar.current.date(byAdding: .year, value: -1, to: profile.goalDate)!
let max = Calendar.current.date(byAdding: .year, value: 1, to: profile.goalDate)!
return min...max
}
var today = Date()
var sevendaysaftertoday = Calendar.current.date(byAdding: .day, value: 7, to: today)!
var testrange : ClosedRange<Date> = today...sevendaysaftertoday
var body: some View {
List{
HStack{
Text("UserName")
Spacer()
TextField("userName", text: $profile.userName)
.foregroundStyle(.secondary)
.multilineTextAlignment(.trailing)
}
Toggle(isOn: $profile.prefersNotifications){
Text("Enable Notifications")
}
Picker("Seasonal Photo", selection: $profile.seasonalPhoto){
// Profile.Season 열거형의 모든 Case를 가져옵니다.
ForEach(Profile.Season.allCases){
season in
Text(season.rawValue).tag(season)
}
}
DatePicker(selection: $profile.goalDate, in:dateRange, displayedComponents: .date ){
Text("Goal Date")
}
}
}
}
#Preview {
ProfileEditor(profile: .constant(Profile.default))
}
동작하지 않더라구요! 문제는 다음과 같았습니다.
1. Swift에서는 프로퍼티 초기화 중 다른 인스턴스 멤버를 직접 참조할 수 없습니다.
ㄴ 이는 인스턴스가 완전히 초기화 되기 전에 다른 인스턴스 멤버를 사용할 수 없기 때문입니다.
ㄴ 때문에 초기화가 완료된 후에 값을 설정하는 방법을 사용해야합니다.
ㄴ 이를 init 메서드를 사용해서 초기화를 수행해서 해결할 수 있습니다.
import SwiftUI
struct ContentView: View {
var today: Date
var sevendaysaftertoday: Date
var testrange: ClosedRange<Date>
init() {
self.today = Date()
self.sevendaysaftertoday = Calendar.current.date(byAdding: .day, value: 7, to: today)!
self.testrange = today...sevendaysaftertoday
}
var body: some View {
VStack {
DatePicker("Select a date", selection: .constant(today), in: testrange, displayedComponents: .date)
.datePickerStyle(GraphicalDatePickerStyle())
.padding()
Text("Today: \(today)")
Text("7 Days After Today: \(sevendaysaftertoday)")
}
}
}
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
여기서 한가지 더 살펴보자면
self.sevendaysaftertoday = Calendar.current.date(byAdding: .day, value: 7, to: today)!
이 코드는 오늘로부터 7일 후를 가리키는 코드입니다.
'Ios > Swift UI' 카테고리의 다른 글
CloseRange (0) | 2024.07.26 |
---|---|
부모뷰에서 자식뷰로 상태를 바인딩해서 전달할 때 : $ (0) | 2024.07.26 |
@State, @Binding, @ObservedObject (0) | 2024.07.26 |
@Environment (0) | 2024.07.26 |
Swift UI 메서드 정리 ( 계속 추가 ) (2) | 2024.07.24 |