xcode 检索数据时,初始化前使用的变量“...”出错

qacovj5a  于 2023-02-25  发布在  其他
关注(0)|答案(1)|浏览(88)

我正在开发一个应用程序的消息传递部分,我为消息创建的结构体遇到了问题。我创建了一个名为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
  }
}
r7s23pms

r7s23pms1#

init?(document: QueryDocumentSnapshot)中,您不会将变量赋给示例属性,而只会将它们赋给局部变量:

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

let senderIdlet fromID等与示例属性senderIdfromID不是同一个变量,所以在确认它们不是nil值之后(即上面的guard之后),需要将它们实际赋给示例属性:

self.senderId = senderId
self.fromID = fromID

等等

相关问题