我正在将我的项目Objective-C代码转换为Swift。事情很好,但在循环中我有一个类似于它的类型转换问题的错误。在此先感谢。
class GymUserSession: NSObject {
var passes = [AnyHashable]()
func getPassList() -> [AnyHashable]? {
var list = [AnyHashable]()
for pass: GymPass? in passes {
if pass?.isGift == nil || pass?.activated != nil {
if let aPass = pass {
list.append(aPass)
}
}
}
return list
}
}
GymPass是另一个NSObject类
class GymPass: NSObject {
var gymID : String
var passID : String
var isGift : Bool
var activated : Bool
var dateCreated : Date?
var dateActivated : Date?
}
答案 0 :(得分:2)
简短的回答是,斯威夫特不能隐含地将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 } )
}
}