В проекте «Тесты» у меня есть расширения с некоторыми тестовыми вспомогательными функциями. Например:Не удалось отличить значение типа «Swift.UInt32» с «Swift.Int»
extension Employee {
static func mockDict() -> Dictionary<String, Any>! {
return ["ID": arc4random() % 1000,
"FirstName": "Employee First Name",
...]
}
}
(Я снял ненужный код). У меня есть проблема доступа к ID из этого словаря по какой-то еще неизвестной причине. У меня SIGABRT 6 при литье
employeeDict["ID"] as! Int
Xcode отладчик консоли также не нравится это конкретное целое:
Строки работает отлично. Вы столкнулись с такой проблемой? Есть идеи?
EDIT: На всякий случай кто-то столкнется с этой проблемой. КАСТИНГ ОТ UInt32/Int32 TO Int FAILS BY DESIGN. Даже если объект был отлит в Any
или Anyobject
между ними. Даже если
@available(*, message: "Converting UInt32 to Int will always succeed.")
public init?(exactly value: UInt32)
в декларации Int в
public struct Int : SignedInteger, Comparable, Equatable {
...
}
и
public struct Int32 : SignedInteger, Comparable, Equatable {
...
}
EDIT 2 для тех, кто может столкнуться такое поведение в JSON сериализации. Да, сериализация с ошибкой NSInvalidArgumentException
Invalid type in JSON write (_SwiftValue)
, если просят сериализации UInt32, Int64 или любой экземпляр протокола Integer, кроме Int
Спасибо, я сделал обходной путь таким образом. Но я все еще сбиваюсь с толку, потому что приложение работает на iPhone 7 sim, где Int - 64 бит. Также 892 определенно является Integer, который не будет вызывать переполнение или любые другие проблемы. – user1232690
Я думаю, проблема в том, что вы пытаетесь указать число как целое, а не целое число из UInt32. Кроме того, если бы мой ответ помог вам, не могли бы вы принять его? Благодаря! – penatheboss
Готово. Я добавил некоторые детали в вопрос. BTW, только универсальный способ, который я нашел, - использовать 'NSNumber', чтобы добавить возможность использовать экземпляры протокола Integer в' Int' без сбоев. – user1232690