protocol AuthRepository {
associatedtype AuthData
associatedtype AuthResponseData
associatedtype RegistrationData
associatedtype RegistrationResponseData
func login(with data: AuthData) async throws -> AuthResponseData?
func register(with data: RegistrationData) async throws -> RegistrationResponseData?
}
< /code>
и реализация для моего сервера < /p>
struct MyServerAuthData {
let email: String
let password: String
}
struct MyServerAuthResponseData {
let token: String
}
struct MyServerRegistrationData {
let email: String
let password: String
let name: String
}
actor AuthRepositoryImpl: AuthRepository {
func login(with data: MyServerAuthData) async throws -> MyServerAuthResponseData? {
...
}
func register(with data: MyServerRegistrationData) async throws -> Void? {
...
}
}
< /code>
Для использования в приложении я создал этот ViewModel < /p>
@MainActor
final class AuthViewModel: ObservableObject {
private let repository: T
init(repository: T) {
self.repository = repository
}
func login(data: T.AuthData) async throws -> T.AuthResponseData? {
try await repository.login(with: data)
}
func register(with data: T.RegistrationData) async throws {
try await repository.register(with: data)
}
}
< /code>
Определено в приложении как < /p>
@main
struct MyApp: App {
@StateObject var authViewModel = AuthViewModel(repository: AuthRepositoryImpl())
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(self.authViewModel)
}
}
}
< /code>
и потребляется как < /p>
@EnvironmentObject private var authViewModel: AuthViewModel
Но с помощью этого кода вся концепция использования общей реализации для репозитория Auth бесполезно, потому что изменение Authrepostory необходимо будет искать и заменить AuthviewModel Все приложение. .
Есть лучший способ сделать это?
Я должен признать, что мои знания о Swift ограничены, и я не могу обойтись по этой проблеме. Приложение.[code]protocol AuthRepository { associatedtype AuthData associatedtype AuthResponseData associatedtype RegistrationData associatedtype RegistrationResponseData
func register(with data: MyServerRegistrationData) async throws -> Void? { ... } } < /code> Для использования в приложении я создал этот ViewModel < /p> @MainActor final class AuthViewModel: ObservableObject { private let repository: T
var body: some Scene { WindowGroup { ContentView() .environmentObject(self.authViewModel) } } } < /code> и потребляется как < /p> @EnvironmentObject private var authViewModel: AuthViewModel [/code] Но с помощью этого кода вся концепция использования общей реализации для репозитория Auth бесполезно, потому что изменение Authrepostory необходимо будет искать и заменить AuthviewModel Все приложение. . Есть лучший способ сделать это?