Как исправить эту ошибку компилятора Swift для вызова метода onReceive? - PullRequest
0 голосов
/ 31 октября 2019

Я выделил этот кусок кода на детской площадке, используя Xcode 11.1:


import SwiftUI
import PlaygroundSupport

struct ContentView: View {
    @State var name: String = ""

    var body: some View {
        List {
            Text(String(describing: name))
            TextField("First Name", text: $name)
        }.onReceive($name) { n in
            print("hey \(n)")
        }
    }
}

let uv = ContentView()
PlaygroundPage.current.liveView = UIHostingController(rootView: uv)

Это не скомпилируется, если я не оставлю часть onReceive. Сообщение об ошибке «Невозможно определить тип замыкания», но аннотирование метода, кажется, только дает мне другие ошибки, а не то, что компилируется.

Как исправить этот фрагмент?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Поскольку я не могу удалить этот вопрос, я сам выложу здесь ответ.

Проблема, с которой я столкнулся, заключалась в том, что я пытался преобразовать @State в Publisher, а для onReceive требуетсяPublisher (как указано @jfuellert). В последующем вопросе (который я удалил) пользователь @matt указал мне на @ObservedObject для моего варианта использования.

Один простой способ сделать то, что я пытался сделать с @State, - это воспользоватьсятого факта, что каждый раз, когда состояние var изменяется, тело будет переоцениваться:

struct ContentView: View {
    @State var name: String = ""

    var body: some View {
        print("hey \(name)")
        return List {
            Text(String(describing: name))
            TextField("First Name", text: $name)
        }
    }
}
0 голосов
/ 31 октября 2019

Функция onReceive принимает тип издателя, поэтому вам нужно изменить $name на name.publisher.

var body: some View {
        List {
            Text(String(describing: name))
            TextField("First Name", text: $name)
        }.onReceive(name.publisher) { n in
            print("hey \(n)")
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...