@Published класс не имеет члена .store | Объединить SwiftUI - PullRequest
1 голос
/ 14 апреля 2020

Пытался решить задачу с этапа через Combine, но застрял на ошибке:

Value of type 'Published<[User]>.Publisher' has no member 'store'

Исходный код:

import Combine
import Foundation


// MARK: Main model from API
struct User: Decodable, Identifiable {
    let id: UUID
    let isActive: Bool
    let name: String
    let age: Int
    let company: String
    let email: String
    let address: String
    let about: String
    let registered: Date
    let tags: [String]
    let friends: [Friend]
}

// MARK: - Friend array API
struct Friend: Decodable {
    let id: String
    let name: String
}


final class ViewModel: ObservableObject {
    @Published var model = [User]()

    private var subscriptions: Set<AnyCancellable> = []

    // Error: Value of type 'Published<[User]>.Publisher' has no member 'store'
    init() { $model.store(in: &subscriptions )}
}

extension ViewModel {
    // MARK: - Make request to API
    func fetch() -> AnyPublisher<User, Error> {
        guard let mainURL = URL(string: "https://www.hackingwithswift.com/samples/friendface.json") else {
            fatalError("404: Not found")
        }

        return URLSession.shared.dataTaskPublisher(for: mainURL)
            .map(\.data)
            .decode(type: User.self, decoder: JSONDecoder())
            .receive(on: RunLoop.main)
            .eraseToAnyPublisher()
    }
}

Не понимаю, где мне нужно создать издателя?

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Учитывая ваш другой код, здесь используется (скомпилировано с Xcode 11.4)

init() {
  self.fetch()
    .sink(receiveCompletion: { _ in
        // do here whatever needed with error
    }, receiveValue: { [weak self] user in
        self?.model.append(user)
    })
    .store(in: &subscriptions)
}
0 голосов
/ 14 апреля 2020

У вашего пользователя структуры нет магазина. Поэтому вы пытаетесь добавить в свою структуру что-то, что не существует. Посмотрите на свою структуру, там нет магазина:

struct User: Decodable, Identifiable {
    let id: UUID
    let isActive: Bool
    let name: String
    let age: Int
    let company: String
    let email: String
    let address: String
    let about: String
    let registered: Date
    let tags: [String]
    let friends: [Friend]
}
...