如何在 Swift 5.1 中修复“无法在没有参数的情况下调用‘发送’”

Posted

技术标签:

【中文标题】如何在 Swift 5.1 中修复“无法在没有参数的情况下调用‘发送’”【英文标题】:How to fix "Cannot invoke 'send' with no arguments" in Swift 5.1 【发布时间】:2019-06-11 16:24:45 【问题描述】:

我一直在尝试关注“介绍 SwiftUI - 构建您的第一个应用程序”WWDC 19 视频。本次演讲没有提供示例代码,但随着演示者的进行,我一直在创建它。在尝试创建商店时,虽然我收到一条错误消息,即“无法在没有参数的情况下调用'发送'”:

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。

【问题讨论】:

【参考方案1】:

PassthroughSubject&lt;Void, Never&gt; 是您的发布者,它被声明为:

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

这是send函数:

final func send(_ input: Output)

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

替换:

didChange.send()

didChange.send(())

【讨论】:

【参考方案2】:

将您的代码替换为

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

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

    var didChange = PassthroughSubject<ReferenceStore, Never>()

【讨论】:

【参考方案3】:

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>()

【讨论】:

以上是关于如何在 Swift 5.1 中修复“无法在没有参数的情况下调用‘发送’”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 的操场上修复“调用中的额外参数 'at'”

如何在Swift 3中修复我的自定义UITextField对象?

试图在 Swift 5.1 中将 UIImage 转换为 PFFileObject

Xcode 7.0.1 - 无效的 Swift 支持 - cocoapods 如何修复?

Alamofire 2.0 和 Swift 2 - 标头不工作。看看如何修复它

如何解决问题 UIPickerView 致命错误:索引超出范围 [IOS Swift 5.1 Xcode 11.2]