我正在开发一个应用程序的消息传递部分,我为消息创建的结构体遇到了问题。我创建了一个名为chatPartnerID的变量,它返回消息发送的来源或目的地的ID,这取决于消息是否由用户发送:
var toID: String
var fromID: String
var isFromCurrentUser = Bool()
var chatPartnerId: String {
return isFromCurrentUser ? toID : fromID
}
在第83行,**我收到一个错误,内容如下:"变量self.toID"在初始化之前使用。**我不明白为什么。
下面是代码:
struct Message: MessageType {
var id: String?
let sentDate: Date
let sender: SenderType
var image: UIImage?
var downloadURL: URL?
var content: String?
var toID: String
var fromID: String
var isFromCurrentUser = Bool()
var chatPartnerId: String {
return isFromCurrentUser ? toID : fromID
}
var messageId: String {
return id ?? UUID().uuidString
}
var kind: MessageKind {
if let image = image {
let mediaItem = ImageMediaItem(image: image)
return .photo(mediaItem)
} else {
return .text(content ?? "")
}
}
init(user: User, content: String, fromID: String, toID: String) {
sender = Sender(senderId: user.uid!, displayName: user.name!)
self.content = content
self.fromID = fromID
self.toID = toID
sentDate = Date()
id = nil
}
init(user: User, image: UIImage, fromID: String, toID: String) {
sender = Sender(senderId: user.uid!, displayName: user.name!)
self.image = image
content = ""
self.fromID = fromID
self.toID = toID
sentDate = Date()
id = nil
}
init?(document: QueryDocumentSnapshot) {
let data = document.data()
guard let sentDate = data["created"] as? Timestamp,
let senderId = data["senderId"] as? String,
let fromID = data["fromID"] as? String,
let toID = data["toID"] as? String,
let senderName = data["senderName"] as? String
else { return nil }
id = document.documentID
self.sentDate = sentDate.dateValue()
sender = Sender(senderId: senderId, displayName: senderName)
self.isFromCurrentUser = fromID == Auth.auth().currentUser?.uid
if let content = data["content"] as? String {
self.content = content
downloadURL = nil
} else if let urlString = data["url"] as? String, let url = URL(string: urlString) {
downloadURL = url
content = ""
} else {
return nil
}
} //THIS IS line 83
}
// MARK: - DatabaseRepresentation
extension Message: DatabaseRepresentation {
var representation: [String: Any] {
var rep: [String: Any] = [
"created": sentDate,
"senderId": sender.senderId,
"fromID": fromID,
"toID": toID,
"senderName": sender.displayName
]
if let url = downloadURL {
rep["url"] = url.absoluteString
} else {
rep["content"] = content
}
return rep
}
}
// MARK: - Comparable
extension Message: Comparable {
static func == (lhs: Message, rhs: Message) -> Bool {
return lhs.id == rhs.id
}
static func < (lhs: Message, rhs: Message) -> Bool {
return lhs.sentDate < rhs.sentDate
}
}
1条答案
按热度按时间r7s23pms1#
在
init?(document: QueryDocumentSnapshot)
中,您不会将变量赋给示例属性,而只会将它们赋给局部变量:即
let senderId
、let fromID
等与示例属性senderId
、fromID
不是同一个变量,所以在确认它们不是nil
值之后(即上面的guard
之后),需要将它们实际赋给示例属性:等等