BaseViewModel будет следовать принципу DRY в iOS с использованием SwiftIOS

Программируем под IOS
Ответить
Anonymous
 BaseViewModel будет следовать принципу DRY в iOS с использованием Swift

Сообщение Anonymous »

Я родом из мира Android, где есть абстрактный класс. Я пытаюсь улучшить iOS, используя Swift. Я создаю базовый класс следующим образом:

Код: Выделить всё

class BaseViewModel: ObservableObject {
typealias GHError = APIService.GHError

@Published var result = Resource.loading

let apiService = APIService()

init() {
refresh()
}

func getSuccessResult() async throws -> T? {
return nil
}

func refresh() {
result = Resource.loading
Task { @MainActor in
do {
if let successResult = try await getSuccessResult() {
result = Resource.success(successResult)
}
} catch GHError.invalidURL {
result = Resource.error("Invalid URL")
} catch GHError.invalidResponse {
result = Resource.error("Invalid response")
} catch GHError.invalidData {
result = Resource.error("Invalid data")
} catch {
result = Resource.error("Unexpected error")
}
}
}

enum Resource {
case loading
case success(T)
case error(String)
}
}
Я стараюсь избегать написания метода обновления в каждой создаваемой мной ViewModel, поэтому я создал базу, и поскольку в Swift у нас нет абстрактного метода, я добавляю этот метод, который возвращает ноль в базовом классе:

Код: Выделить всё

func getSuccessResult() async throws -> T? {
return nil
}
Вот пример sub viewModel:

Код: Выделить всё

class GithubViewModel : BaseViewModel {

override func getSuccessResult() async throws -> [UserWrapper] {
async let following = apiService.getUsers(endPoint: Constants.followingEndPoint)
async let followers = apiService.getUsers(endPoint: Constants.followersEndPoint)
return try await UserWrapper.createUsers(following: following, followers: followers)
}

private struct Constants {
private static let endPoint = "https://api.github.com/users/alirezaeiii/"
static let followingEndPoint = endPoint + "following"
static let followersEndPoint = endPoint + "followers"
}
}
Это работает нормально, но я не уверен, что следую правильному подходу, следуя принципу DRY (не повторяйтесь).
Было бы вы поможете мне своим комментарием, если есть какие-либо улучшения.
исходный код находится здесь: https://github.com/alirezaeiii/Github-U ... /tree/main

Подробнее здесь: https://stackoverflow.com/questions/791 ... sing-swift
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»