
新增Package.swift和Package.resolved文件以支持Swift Package管理,创建API相关文件(API.swift、APICaller.swift、APIConstants.swift、APIEndpoints.swift、APIService.swift、APILogger.swift、APIModels.swift、Integration-Guide.md)以实现API请求管理和网络交互功能,增强项目的功能性和可扩展性。同时更新.gitignore以排除构建文件和临时文件。
64 lines
1.8 KiB
Swift
64 lines
1.8 KiB
Swift
import Foundation
|
|
import ComposableArchitecture
|
|
|
|
@Reducer
|
|
struct InitFeature {
|
|
@ObservableState
|
|
struct State: Equatable {
|
|
var isLoading = false
|
|
var response: InitResponse?
|
|
var error: String?
|
|
}
|
|
|
|
enum Action: Equatable {
|
|
case initialize
|
|
case initializeResponse(TaskResult<InitResponse>)
|
|
}
|
|
|
|
@Dependency(\.apiService) var apiService
|
|
|
|
var body: some ReducerOf<Self> {
|
|
Reduce { state, action in
|
|
switch action {
|
|
case .initialize:
|
|
state.isLoading = true
|
|
state.error = nil
|
|
|
|
return .run { send in
|
|
let request = InitRequest()
|
|
await send(.initializeResponse(
|
|
TaskResult {
|
|
try await apiService.request(request)
|
|
}
|
|
))
|
|
}
|
|
|
|
case let .initializeResponse(.success(response)):
|
|
state.isLoading = false
|
|
state.response = response
|
|
return .none
|
|
|
|
case let .initializeResponse(.failure(error)):
|
|
state.isLoading = false
|
|
if let apiError = error as? APIError {
|
|
state.error = apiError.localizedDescription
|
|
} else {
|
|
state.error = error.localizedDescription
|
|
}
|
|
return .none
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - Init API Request
|
|
struct InitRequest: APIRequestProtocol {
|
|
typealias Response = InitResponse
|
|
|
|
var endpoint: String { APIEndpoint.config.path }
|
|
var method: HTTPMethod { .GET }
|
|
var queryParameters: [String: String]? { nil }
|
|
var bodyParameters: [String: Any]? { nil }
|
|
var timeout: TimeInterval { 15.0 }
|
|
}
|