Не удалось привести значение типа "Swift.UInt32" к "Swift.Int"

В проекте Tests у меня есть расширения с некоторыми вспомогательными функциями тестирования. Как это:

extension Employee {
    static func mockDict() -> Dictionary<String, Any>! {
        return ["ID": arc4random() % 1000,
                "FirstName": "Employee First Name",
                ...]
    }
}

(Я удалил ненужный код). У меня проблема с доступом к ID из этого словаря по неизвестной пока причине. У меня SIGABRT 6 при кастинге

employeeDict["ID"] as! Int

Консоль отладчика Xcode также не любит это конкретное целое число:

целые

Струны работают нормально. Вы сталкивались с такой проблемой? Любые идеи?

РЕДАКТИРОВАТЬ: На всякий случай кто-то тоже столкнется с этой проблемой. ПРИВЕДЕНИЕ ИЗ UInt32/Int32 В Int НЕ УДАЕТСЯ ПО ДИЗАЙНУ. Даже если объект был преобразован в 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 {
    ...
}

РЕДАКТИРОВАТЬ 2 для тех, кто может столкнуться с таким поведением при сериализации JSON. Да, сериализация завершается с ошибкой NSInvalidArgumentException Invalid type in JSON write (_SwiftValue), если запрашивается сериализация UInt32, Int64 или любого экземпляра протокола Integer, отличного от Int


person user1232690    schedule 24.10.2016    source источник


Ответы (3)


Попробуй это:

let a = employeeDict["ID"] as! UInt32
let number = Int(a)

Теперь вы можете использовать number для выполнения любых действий.

person Pranav Wadhwa    schedule 24.10.2016
comment
Спасибо, я сделал обходной путь, как это. Но я все еще сбит с толку, потому что приложение работает на iPhone 7 sim, где Int 64 бит. Также 892 определенно является целым числом, которое не вызовет переполнения или каких-либо других проблем. - person user1232690; 25.10.2016
comment
Я думаю, проблема в том, что вы пытаетесь привести число как целое число вместо того, чтобы создавать целое число из UInt32. Кроме того, если мой ответ помог вам, не могли бы вы принять его? Спасибо! - person Pranav Wadhwa; 25.10.2016
comment
Сделанный. Я добавил некоторые детали в вопрос. Кстати, единственный универсальный способ, который я нашел, - это использовать NSNumber, чтобы добавить возможность преобразовывать экземпляры протокола Integer в Int без сбоя. - person user1232690; 25.10.2016

«Примитивные» числовые типы Swift не являются взаимозаменяемыми и не могут быть преобразованы друг в друга.

Вам нужно использовать инициализатор.

Так как arcRandom() возвращает UInt32 и вы хотите использовать значение как Int, немедленно преобразуйте его в объявлении словаря:

["ID": Int(arc4random() % 1000), ...

PS: Не объявляйте явно необязательные значения как неявные развернутые необязательные возвращаемые значения, которые нарушают систему строгого типа Swift.

static func mockDict() -> Dictionary<String, Any>
person vadian    schedule 25.10.2016
comment
Сначала я сталкиваюсь с этой проблемой в JSONSerialization. Покопавшись глубже, я обнаружил проблему, которую указал в вопросе. Не существует простого решения для приведения целых чисел, отличных от Int, к Int, если они сначала были преобразованы в Any. Скажем, например, у нас есть адаптер Swift DB с целочисленными полями разного размера. В Objective C их можно было преобразовать в объекты, а затем в целые числа любого типа или сериализовать. Поэтому я был сбит с толку отсутствием этой функциональности в Swift. - person user1232690; 26.10.2016
comment
Касательно ! логика тестирования может иметь нулевой результат, я только что удалил код для создания возможных диктов. Так что вы правы, но в реальном коде все в порядке. - person user1232690; 26.10.2016

Это работает для меня:

Int("\(employeeDict["ID"]!)")
person Oz Shabat    schedule 07.08.2019
comment
Да, вы можете использовать промежуточное литье, чтобы преодолеть это. Проблема преобразования UInt32 -> Int была в основном исправлена, особенно в JSONSerialization, который приводил к сбою при сериализации диктов с помощью UInt32. - person user1232690; 08.08.2019