본문 바로가기
Ios/Swift UI

프로퍼티 초기화 중에 다른 인스턴스 멤버를 직접 참조할 수 없습니다.

by 잘먹는 개발자 에단 2024. 7. 26.

간단히 테스트 하려고 코드를 가운데 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