Получение Должен иметь uuid, если нет исключения _objectID при вставке объекта в словарь

Я пишу модульный тест для класса, который использует тип 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"
    }
}

При отладке вызывается переопределяющая хэш-переменная.


person Sanich    schedule 29.12.2019    source источник


Ответы (1)


У меня была такая же проблема с PHAsset при модульном тестировании 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
    }
}
person Simo Ala-Kotila    schedule 01.10.2020
comment
Благодарю вас! Это мне очень помогло, хотя я никогда не думал о его подклассе. - person Leonel Menezes Morato Lima; 01.07.2021