Swift: ObservableObject, инициализатор не определяет все свойства? - PullRequest
0 голосов
/ 17 марта 2020

В настоящее время у меня есть код ниже, который я пытаюсь использовать в качестве переключателя навигации, чтобы я мог перемещаться по различным представлениям, не используя дрянные ссылки NavigationLinks и другие. По умолчанию я WebDev, поэтому у меня возникло множество проблем, связанных с передачей моих знаний в Swift, синтаксис совершенно не похож на любой код, который я написал ранее. В любом случае, вот код:

import Foundation
import Combine
import SwiftUI

class ViewRouter: ObservableObject {
    let objectWillChange: PassthroughSubject<ViewRouter,Never>

    @Published var currentPage: String = "page1" {
        didSet {
            objectWillChange.send(self)
        }
    }

    init(currentPage: String) {
        self.currentPage = currentPage
    }

}

Как видите, это действительно просто, и я просто использую объект для переключения значений и отображения разных представлений в другом файле, единственные ошибки, которые мешают мне его построить тот факт, что инициализатор говорит «Возврат из инициализатора без инициализации всех сохраненных свойств», хотя единственной переменной является переменная currentPage, которая определена. Я знаю, что он говорит, что objectWillChange не определяется сообщением, но objectWillChange не имеет какого-либо значения для назначения. Любая помощь будет оценена.

1 Ответ

1 голос
/ 17 марта 2020

Вы просто объявляете objectWillChange, но не инициализируете его.

Просто измените объявление с

let objectWillChange: PassthroughSubject<ViewRouter,Never>

на

let objectWillChange = PassthroughSubject<ViewRouter,Never>()

Однако, используя PassthroughSubject не должно быть необходимым. currentPage уже @Published, так что вы можете просто подписаться на его издателя. То, что вы пытаетесь достичь с помощью PassthroughSubject и didSet, уже определено оболочками свойств swiftUI, ObservableObject и Published.

class ViewRouter: ObservableObject {

    @Published var currentPage: String

    init(currentPage: String) {
        self.currentPage = currentPage
    }

}

Тогда вы можете просто сделать

let router = ViewRouter(currentPage: "a")
router.$currentPage.sink { page in print(page) }

router.currentPage = "b" // the above subscription prints `"b"`
...