Я получаю набор целых чисел через ответ api json (который я конвертирую в словарь [String: Any]
). Эти целые числа гарантированно находятся в диапазоне 10 ... 10 (включительно). В моей модели я хотел бы сохранить их как Int8
.Безопасное литье из Int в Int8 в Swift
Вот как я конвертирую свой json-словарь в объект модели, но мне интересно, есть ли более идиоматический способ обеспечения того, чтобы ints в json действительно вписывался в Int8
?
func move(with dict: JSONDictionary) -> Move? {
if let rowOffset = dict[JSONKeys.rowOffsetKey] as? Int,
let colOffset = dict[JSONKeys.colOffsetKey] as? Int {
if let rowInt8 = Int8(exactly: rowOffset),
let colInt8 = Int8(exactly: colOffset) {
return Move(rowOffset: rowInt8, colOffset: colInt8)
}
else {
print("Error: values out of range: (row: \(rowOffset), col: \(colOffset)")
}
} else {
print("Error: Missing key, either: \(JSONKeys.rowOffsetKey) or \(JSONKeys.colOffsetKey)")
}
return nil
}
Обратите внимание, что, выполнив следующие действия всегда терпит неудачу, независимо от стоимости входящих Интс:
if let rowOffset = dict[JSONKeys.rowOffsetKey] as? Int8,
let colOffset = dict[JSONKeys.colOffsetKey] as? Int8 {
...
Это, как я преобразование входящего JSON в словарь. Json, о котором идет речь, глубоко вложен и содержит несколько разных типов.
typealias JSONDictionary = [String: Any]
let jsonDict = try JSONSerialization.jsonObject(with: data) as? JSONDictionary
Не могли бы вы показать, как вы создаете 'JSONDictionary'? Литой 'как? Int8' должен работать нормально, если значения 'NSNumber', которые не исходят от Swift (не' Int8') до моста Obj-C, хотя для 'NSNumber' со значениями вне диапазона для' Int8', дополнительные биты будут усечены. – Hamish
Обновлено, чтобы ответить на ваш вопрос. – RobertJoseph
Да, странно, что 'как? Int' тогда не работает в вашем случае (хотя в любом случае вы заявили, что не хотите усекать поведение, поэтому вы все равно не захотите его использовать), но [этот пример демонстрирует] (https: //gist.github.com/hamishknight/5a673c23c5346c420588e9dd7d171228), что бросок должен работать. – Hamish