StateObject をパラメータとして受け取る View を初期化するにはどうすればいいですか? 質問する

StateObject をパラメータとして受け取る View を初期化するにはどうすればいいですか? 質問する
struct ProfileEditView: View {

    @ObservedObject var viewModel: UsersViewModel
    @StateObject var auth: Authenticator

    @State var showingImageEditor: Bool = false

    init(_ viewModel: UsersViewModel, _ auth: Authenticator) {
    
        self.viewModel = viewModel
        self.auth = auth
    
        UITableView.appearance().backgroundColor = UIColor.clear
        UITableViewCell.appearance().selectionStyle = .none
    }

    var body: some View { }
}

私は手動でViewを初期化しようとしています。状態オブジェクトパラメータとして。次のエラーが発生します:

Cannot assign to property: 'auth' is a get-only property

初期化子の正しい書き方は何ですか?

ベストアンサー1

Authenticatorとの定義がないとコードを完全に再現することはできませんUsersViewModelが、コンパイルできました。

class UsersViewModel: ObservableObject {}
class Authenticator: ObservableObject {}

struct ProfileEditView: View {
    @ObservedObject var viewModel: UsersViewModel
    @StateObject var auth: Authenticator

    @State var showingImageEditor: Bool = false

    init(_ viewModel: ObservedObject<UsersViewModel>, _ auth: Authenticator) {

        _viewModel = viewModel
        _auth = StateObject(wrappedValue: auth)

        UITableView.appearance().backgroundColor = UIColor.clear
        UITableViewCell.appearance().selectionStyle = .none
    }

    var body: some View {
        Text("something")
    }
}

主な変更点は次のとおりです。

init(_ viewModel: ObservedObject<UsersViewModel>, _ auth: Authenticator) {
    _viewModel = viewModel
    _auth = StateObject(wrappedValue: auth)

私の変更が理解できない場合は、Googleで検索してください

「Swift プロパティ ラッパー」

プロパティ ラッパーとは何か、どのように使用するのかをより深く理解します。

おすすめ記事