0

I am trying to make a class "Activity" as hashable for use in swiftUI List. I followed protocol instructions for making it hashable, but when I do,I get an error later in the code that says I am using an undeclared type. This type is valid (in firebase import) if I do not try to make the class hashable. I am running XCode 11.3.1 and Swift 5.

I was hoping someone could lend an eye and help me figure this out.

The updates to the code I use to make it hashable is below:

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
      }

But when I do this, I get the following error later in the code which appears completely unrelated.

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

When I do not add that code, I do not get that error. Clearly I am doing something stupid.

Here is the entire class (before hashable) with no errors:

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
        ]
    }
}

And here is the full class with hashable that causes the error to occur

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
        ]
    }
}
Paul Linck
  • 75
  • 2
  • 8
  • Restart Xcode - sometimes Xcode randomly causes problems like this. Additionally, you could clean the project using `Command + Option + Shift + K`. – George Mar 10 '20 at 15:10
  • It could also be a compiler error. Have you tried casting document.documentID as a string before setting self.id. self.id = (document.documentID as String) – HalR Mar 10 '20 at 23:46

0 Answers0