如何在Swift中的联合收割机中在订户中引用自身
刚开始接触Combine,我遇到了一个问题,当类从如何在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)
发布者
接收到值时,我需要在类中调用一个方法,在本例中,是从通知中心
发出的通知
这是订阅费
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无关。好的,添加了完整的文件。使它成为类方法并没有帮助,因为我正在改变实例的状态。你能多告诉我一点关于另一个建议吗?我不太明白你的意思?