Swift5 SwiftUI в соответствии с Hashable вызывает необъявленный тип - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь сделать класс "Activity" как пригодный для использования в swiftUI List. Я следовал инструкциям протокола, чтобы сделать его хешируемым, но когда я это сделал, позже в коде появляется ошибка, в которой говорится, что я использую необъявленный тип. Этот тип действителен (в импорте Firebase), если я не пытаюсь сделать класс хэшируемым. Я использую XCode 11.3.1 и Swift 5.

Я надеялся, что кто-нибудь может мне помочь и помочь мне разобраться в этом.

Обновления кода, который я использую, чтобы сделать его хешируемым, ниже:

class Activity: Identifiable, Hashable {
     func hash(into hasher: inout Hasher) {
          hasher.combine(id)
      }

      static func == (lhs: Activity, rhs: Activity) -> Bool {
          return lhs.id == rhs.id
      }

Но когда я это делаю, позже в коде появляется следующая ошибка, которая кажется совершенно не связанной.

    init(document: DocumentSnapshot) {
        self.id = document.documentID
---> Use of undeclared type 'DocumentSnapshot'

Когда я не добавляю этот код, я делаю не получить эту ошибку. Очевидно, я делаю что-то глупое.

Вот весь класс (до хэширования) без ошибок:

import Foundation
import Firebase

class Activity: Identifiable {

    var id: String?

    var activityDateTime: Date
    var activityName: String
    var activityType: String
    var displayName: String
    var distance: Double
    var distanceUnits: String
    var duration: Double
    var email: String
    var teamName: String
    var teamUid: String
    var uid: String


    init() {
        self.id = nil

        self.activityDateTime = Date()
        self.activityName = ""
        self.activityType = ""
        self.displayName = ""
        self.distance = 0.0
        self.distanceUnits = ""
        self.duration = 0.0
        self.email = ""
        self.teamName = ""
        self.teamUid = ""
        self.uid = ""

    }

    init(id: String, activityName: String, distance: Double) {
        self.id = id

        self.activityDateTime = Date()
        self.activityName = activityName
        self.activityType = ""
        self.displayName = ""
        self.distance = distance
        self.distanceUnits = "Miles"
        self.duration = 0.0
        self.email = ""
        self.teamName = ""
        self.teamUid = ""
        self.uid = ""
    }

    init(document: DocumentSnapshot) {
        self.id = document.documentID

        let timestamp = document.get("activityDateTime") as! Timestamp
        self.activityDateTime = timestamp.dateValue()
        self.activityName = document.get("activityName") as? String ?? ""
        self.activityType = document.get("activityType") as? String ?? ""
        self.displayName = document.get("displayName") as? String ?? ""
        self.distance = document.get("distance") as? Double ?? 0.0
        self.distanceUnits = document.get("distanceUnits") as? String ?? "Miles"
        self.duration = document.get("duration") as? Double ?? 0.0
        self.email = document.get("email") as? String ?? ""
        self.teamName = document.get("teamName") as? String ?? ""
        self.teamUid = document.get("teamUid") as? String ?? ""
        self.uid = document.get("uid") as? String ?? ""
    }

    // For JSON Output
    func toAnyObject() -> Any {
        return [
            "id": id as Any,

            "activityDateTime": activityDateTime,
            "activityName": activityName,
            "activityType": activityType,
            "displayName": displayName,
            "distance": distance,
            "distanceUnits": distanceUnits,
            "duration": duration,
            "email": email,
            "teamName": teamName,
            "teamUid": teamName,
            "uid": uid
        ]
    }
}

А вот полный класс с хэшированием, который вызывает ошибку

import Foundation
import Firebase

class Activity: Identifiable, Hashable {
     func hash(into hasher: inout Hasher) {
          hasher.combine(id)
      }

      static func == (lhs: Activity, rhs: Activity) -> Bool {
          return lhs.id == rhs.id
      }


    var id: String?

    var activityDateTime: Date
    var activityName: String
    var activityType: String
    var displayName: String
    var distance: Double
    var distanceUnits: String
    var duration: Double
    var email: String
    var teamName: String
    var teamUid: String
    var uid: String


    init() {
        self.id = nil

        self.activityDateTime = Date()
        self.activityName = ""
        self.activityType = ""
        self.displayName = ""
        self.distance = 0.0
        self.distanceUnits = ""
        self.duration = 0.0
        self.email = ""
        self.teamName = ""
        self.teamUid = ""
        self.uid = ""

    }

    init(id: String, activityName: String, distance: Double) {
        self.id = id

        self.activityDateTime = Date()
        self.activityName = activityName
        self.activityType = ""
        self.displayName = ""
        self.distance = distance
        self.distanceUnits = "Miles"
        self.duration = 0.0
        self.email = ""
        self.teamName = ""
        self.teamUid = ""
        self.uid = ""
    }

    init(document: DocumentSnapshot) {
        self.id = document.documentID

        let timestamp = document.get("activityDateTime") as! Timestamp
        self.activityDateTime = timestamp.dateValue()
        self.activityName = document.get("activityName") as? String ?? ""
        self.activityType = document.get("activityType") as? String ?? ""
        self.displayName = document.get("displayName") as? String ?? ""
        self.distance = document.get("distance") as? Double ?? 0.0
        self.distanceUnits = document.get("distanceUnits") as? String ?? "Miles"
        self.duration = document.get("duration") as? Double ?? 0.0
        self.email = document.get("email") as? String ?? ""
        self.teamName = document.get("teamName") as? String ?? ""
        self.teamUid = document.get("teamUid") as? String ?? ""
        self.uid = document.get("uid") as? String ?? ""
    }

    // For JSON Output
    func toAnyObject() -> Any {
        return [
            "id": id as Any,

            "activityDateTime": activityDateTime,
            "activityName": activityName,
            "activityType": activityType,
            "displayName": displayName,
            "distance": distance,
            "distanceUnits": distanceUnits,
            "duration": duration,
            "email": email,
            "teamName": teamName,
            "teamUid": teamName,
            "uid": uid
        ]
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...