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