Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Swift中的联合收割机中在订户中引用自身_Swift_Nsnotificationcenter_Publisher_Subscriber_Combine - Fatal编程技术网

如何在Swift中的联合收割机中在订户中引用自身

如何在Swift中的联合收割机中在订户中引用自身,swift,nsnotificationcenter,publisher,subscriber,combine,Swift,Nsnotificationcenter,Publisher,Subscriber,Combine,刚开始接触Combine,我遇到了一个问题,当类从发布者接收到值时,我需要在类中调用一个方法,在本例中,是从通知中心发出的通知 这是订阅费 let subscribe = NotificationCenter.default.publisher(for: Notification.Name(rawValue: "LocalTalkNotificationReceivedData"), object: nil) .map( { ($0.object as! Data)

刚开始接触Combine,我遇到了一个问题,当类从
发布者
接收到值时,我需要在类中调用一个方法,在本例中,是从
通知中心
发出的
通知

这是订阅费

let subscribe = NotificationCenter.default.publisher(for: Notification.Name(rawValue: "LocalTalkNotificationReceivedData"), object: nil)
    .map( {
        ($0.object as! Data)
    } )
    .sink(receiveValue: {
        self.interpretIncoming(data: $0)
    })
编译器告诉我的是
使用未解析的标识符“self”
。 很晚了,我有点累,有人有主意吗? 卡塔琳娜beta 5上的Xcode 11 beta 5 btw

完整文件:

import Foundation
import Combine
import SwiftUI

public class MessageData: ObservableObject, Identifiable {
public var peerData: [Peer] = [Peer]()
public var messageData: [Message] = [Message]()
public var objectWillChange = PassthroughSubject<Void, Never>()
let subscribe = NotificationCenter.default.publisher(for: Notification.Name(rawValue: "LocalTalkNotificationReceivedData"), object: nil)
    .map( {
        ($0.object as! Data)
    } )
    .sink(receiveValue: {
        self.interpretIncoming(data: $0)
    })

init() {
    self.setupDummyData()
}

private func setupDummyData() {
    self.peerData = self.load("peerData.json")
    self.messageData = self.load("messageData.json")
}

func addMessage(message: String, sender: MessageSource, name: String) {
    let newMessage = Message(id: Date().hashValue,
                             content: message,
                             source: sender,
                             correspondent: name)
    self.messageData.append(newMessage)
    self.objectWillChange.send()
}

func load<T: Decodable>(_ filename: String, as type: T.Type = T.self) -> T {
    let data: Data

    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
        else {
            fatalError("Couldn't find \(filename) in main bundle.")
    }

    do {
        data = try Data(contentsOf: file)
    } catch {
        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
    }

    do {
        let decoder = JSONDecoder()
        return try decoder.decode(T.self, from: data)
    } catch {
        fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
    }
}

func interpretIncoming(data sent: Data) {
    do {
        let receivedTransmission = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(sent) as! [String: Any]
        self.addMessage(message: receivedTransmission["messagePayload"] as! String,
                        sender: .them,
                        name: receivedTransmission["messageSender"] as! String)
    } catch {
        print("FAILED DECODING THING")
    }
}
<代码>导入基础 进口联合收割机 导入快捷键 公共类MessageData:可观察对象,可识别{ 公共变量peerData:[Peer]=[Peer]() public var messageData:[消息]=[消息]() public var objectWillChange=PassthroughSubject() 让subscribe=NotificationCenter.default.publisher(for:Notification.Name(rawValue:“LocalTalkNotificationReceivedData”),对象:nil .地图({ ($0.0对象作为!数据) } ) .接收器(接收值:{ 自我解释(数据:$0) }) init(){ self.setupDummyData() } 私有函数setupDummyData(){ self.peerData=self.load(“peerData.json”) self.messageData=self.load(“messageData.json”) } func addMessage(消息:字符串,发件人:消息源,名称:字符串){ 让newMessage=Message(id:Date().hashValue, 内容:信息,, 资料来源:发件人, 通讯员(姓名) self.messageData.append(newMessage) self.objectWillChange.send() } func load(ufilename:String,as type:T.type=T.self)->T{ 让数据:数据 guard let file=Bundle.main.url(forResource:filename,扩展名:nil) 否则{ fatalError(“在主捆绑包中找不到\(文件名)。” } 做{ 数据=尝试数据(contentsOf:file) }抓住{ fatalError(“无法从主捆绑包加载\(文件名):\n\(错误)”) } 做{ let decoder=JSONDecoder() 返回try decoder.decode(T.self,from:data) }抓住{ fatalError(“无法将\(文件名)解析为\(t.self):\n\(错误)”) } } func解释传入(发送的数据:数据){ 做{ let receivedTransmission=try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(sent)as![String:Any] self.addMessage(消息:receivedTransmission[“messagePayload”]as!字符串, 发件人:。他们, 名称:receivedTransmission[“messageSender”]作为!字符串) }抓住{ 打印(“解码失败的东西”) } }

}您正在调用的上下文中不存在Self。解决这一问题的方法有很多,包括将解释器定义为闭包变量,或将其作为类方法并根据需要调用

除了“自我”这个词外,你问题中的一切都是转移注意力的。你是说:

class MessageData: ObservableObject, Identifiable {
    let subscribe = ... self ...
}
您不能在属性声明的初始值设定项中提到
self
,因为
self
是我们正在初始化的内容;还没有
self


这里一个简单的解决方案可能是将
let subscribe
更改为
lazy var subscribe
,但是您必须在实际代码中请求
subscribe
的值,以便进行初始化。但是,还有许多其他可能的方法。

显示更多代码。self是否存在取决于代码所在的位置。与Combine无关。好的,添加了完整的文件。使它成为类方法并没有帮助,因为我正在改变实例的状态。你能多告诉我一点关于另一个建议吗?我不太明白你的意思?