@Published class не имеет члена .store | Объединить SwiftUI

Пытаюсь решить задачу из вехи через 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()
    }
}

Я не понимаю, где мне создавать паблишера?


person wmorgue    schedule 14.04.2020    source источник


Ответы (2)


Принимая во внимание ваш другой код, вот использование (скомпилировано с 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)
}
person Asperi    schedule 14.04.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]
}
person Community    schedule 14.04.2020