Swift 在将对象插入字典时获取“如果没有_objectID,则必须有uuid”异常

Swift 在将对象插入字典时获取“如果没有_objectID,则必须有uuid”异常,swift,dictionary,hashable,Swift,Dictionary,Hashable,我正在为一个使用PHAsset类型的类编写一个单元测试。我嘲笑它如下: class PHAssetMock: PHAsset { let date: Date let uuid: UUID init(dateStr: String) { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "MM-dd-yyyy HH:mm" self.date =

我正在为一个使用PHAsset类型的类编写一个单元测试。我嘲笑它如下:

class PHAssetMock: PHAsset {
    let date: Date
    let uuid: UUID

    init(dateStr: String) {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "MM-dd-yyyy HH:mm"
        self.date = dateFormatter.date(from: dateStr)!
        self.uuid = UUID()
    }

    override var creationDate: Date? {
        return date
    }

    override var hash: Int {
        let hash = Int(self.date.timeIntervalSinceNow)
        return hash
    }


    static func ==(lhs: PHAsseMock, rhs: PHAsseMock) -> Bool {
        return lhs.date.timeIntervalSinceNow == rhs.date.timeIntervalSinceNow
    }
}

当使用模拟对象的函数尝试将其插入字典时,我得到一个异常:

func foo(assets: [PHAsset]) {
    var label: [T: String]()
    for asset in assets {
        label[asset] = "undefined" // Exception: "NSInternalInconsistencyException", "Must have a uuid if no _objectID"
    }
}

调试时,将调用覆盖哈希变量

我在单元测试框架时遇到了与PHAsset相同的问题。重写isEqual函数有助于消除异常

class Mock : PHAsset {

    let _localIdentifier: String   = UUID().uuidString
    let _hash: Int                 = UUID().hashValue

    override var localIdentifier: String {
        return _localIdentifier
    }

    override var hash: Int {
        return _hash
    }

    override func isEqual(_ object: Any?) -> Bool {
        guard let object = object as? Mock else {
            return false
        }
        return self.localIdentifier == object.localIdentifier
    }
}