4

我一直在尝试关注“介绍 SwiftUI - 构建您的第一个应用程序”WWDC 19 视频。本次演讲没有提供示例代码,但我一直在随着演示者的进行而创建它。在尝试创建商店时,虽然我从该行收到“无法调用 'send' with no arguments”的错误:

didSet { didChange.send() }

我是编程新手,正在努力排除故障。

import SwiftUI
import Combine

class ReferenceStore : BindableObject {
    var references: [Reference] {
        didSet { didChange.send() }
    }

    init(references: [Reference] = []) {
        self.references = references
    }

    var didChange = PassthroughSubject<Void, Never>()
}

如果有帮助,我正在使用 Xcode 11 beta 和 MacOS Catalina。

4

3 回答 3

7

PassthroughSubject<Void, Never>是您的发布者,它被声明为:

final class PassthroughSubject<Output, Failure> where Failure : Error

这是send功能:

final func send(_ input: Output)

这意味着send需要一个Void参数,在 Swift 中是空元组()

代替:

didChange.send()

didChange.send(())

于 2019-06-11T16:56:49.917 回答
0

将您的代码替换为

class ReferenceStore : BindableObject {
    var references: [Reference] {
        didSet { didChange.send(self) }
    }

    init(references: [Reference] = []) {
        self.references = references
    }

    var didChange = PassthroughSubject<ReferenceStore, Never>()
}
于 2019-06-11T16:43:15.393 回答
0

Xcode 11 beta 4中,您可以只使用send()实例方法。

func send()

用法 :

var references: [Reference] {
    didSet { didChange.send() }
}

更新

协议的BindableObject要求现在是willChange 而不是didChange,现在应该在对象更改之前而不是在对象更改之后发送。此更改允许改进更改通知的合并。

因此,将您的代码更改为

class ReferenceStore : BindableObject {
    var references: [Reference] {
        didSet { willChange.send() }
    }

    init(references: [Reference] = []) {
        self.references = references
    }

    var willChange = PassthroughSubject<Void, Never>()
}
于 2019-07-25T19:07:10.410 回答