Я пытаюсь сделать класс "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
]
}
}