' AnyHashable'不可转换为

时间:2018-04-29 00:05:58

标签: ios swift swift4

我正在将我的项目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?
}

Error screen

1 个答案:

答案 0 :(得分:2)

简短的回答是,斯威夫特不能隐含地将AnyHashable转发给GymPass,这就是你要求它做的事情。

可以通过显式向下转换来修复错误,但实际上这只是解决一个让代码编译的小问题

在Swift中,你应该始终使用最明确的类型,当它已知时。 AnyAnyObjectAnyHashable等类型只应在您不知道类型或可能有多种类型时使用。例如,获得解码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 } )

    }
}