Краткий ответ: Свифт не может неявно понизить AnyHashable
до GymPass
, что вы и просили.
Вы могли бы исправить ошибку, явно понижая ее, но на самом деле это всего лишь одна маленькая проблема, которая позволила бы скомпилировать код
В Swift вы всегда должны использовать наиболее явный тип, какой только можете, когда он известен. Такие типы, как Any
, AnyObject
и AnyHashable
, следует использовать только в том случае, если вы не знаете тип или их может быть несколько. Например, для словаря, полученного при декодировании JSON, может быть [String:Any]
, поскольку вы знаете, что он будет иметь String
ключей, но типы значений будут различаться.
В этом случае, вероятно, вы знаете, что passes
будет содержать GymPass
экземпляров. Более «Swifty» версия вашего кода может выглядеть примерно так (но трудно быть конкретным, так как у меня недостаточно подробностей о том, откуда поступают данные и чего вы пытаетесь достичь):
struct GymPass {
var gymID: String
var passID: String
var isGift: Bool
var dateCreated: Date
var dateActivated: Date?
var isActivated: Bool {
get {
return self.dateActivated != nil
}
}
}
class GymUserSession: NSObject {
var passes = [GymPass]()
func getPassList() -> [GymPass] {
return passes.filter ( { $0.isGift || $0.isActivated } )
}
}