首页 > 解决方案 > 将对象插入字典时出现“如果没有 _objectID,则必须有 uuid”异常

问题描述

我正在为使用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"
    }
}

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

标签: swiftdictionaryhashable

解决方案


PHAsset我对when 单元测试Photos框架有同样的问题。覆盖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
    }
}

推荐阅读