Swift Невозможно соединить NSNumber с Int - PullRequest
0 голосов
/ 09 мая 2018

У меня UITableView внутри UIViewController

var userHistory: [[String: Any]] = [[String: Any]]()

override func viewDidLoad() {

    Alamofire.request("http://...").responseJSON { (response) in
        if let responseValue = response.result.value as! [String: Any]? {
            if let responseFoods = responseValue["orders"] as! [[String: Any]]? {
                self.userHistory = responseFoods
                self.collectionView?.reloadData()
            }
        }

    }
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "basCell", for: indexPath) as! BasCollectionViewCell

    let history = userHistory[indexPath.row]
    cell.numberLbl?.text = String(history["id"] as! Int)
    cell.statusLbl?.text = (history["status"] as? String) ?? ""
    let cost = String(history["price"] as! Int) 
    cell.sumLbl?.text = String(cost.dropLast(2)
    cell.dateLbl?.text = (history["date"] as? String) ?? ""

    return cell
}

Проблема в том, что при тестировании на симуляторе у меня iPad mini, iPad Pro, iPhone 7 - все нормально и ошибок нет

Но когда я запускаю iPhone 5, выдает ошибку:

Неустранимая ошибка: невозможно соединить NSNumber с Int: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-902.0.48/src/swift/stdlib/public/SDK/Foundation/NSNumber .swift, линия 367

И

Поток 1: фатальная ошибка: невозможно соединить NSNumber с Int

напротив let cost = String(history["price"] as! Int)

Я не могу понять, что это за проблема

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Swift 4 сделал NSNumber более жестким мостом. Если NSNumber не может быть представлен Int, приведение не выполняется во время выполнения.
Вместо этого вы можете ввести его как Double, но, поскольку вы упомянули, что это не работает только на iPhone 5, мы безопасно приведем его к обоим случаям.

Заменить:

let cost = String(history["price"] as! Int) 

с:

var cost = ""
if let price = dict["price"] as? Int {
    cost = "\(price)"
}
else if let price = dict["price"] as? Double {
    cost = "\(price)"
}
0 голосов
/ 09 мая 2018

Вы не включили значение числа в свой вопрос, поэтому я не могу подтвердить это на 100%. Однако, поскольку вы сказали, что он отлично работает на новых устройствах, но не работает на iPhone 5, я думаю, что вы имеете дело с 32-битной или 64-битной проблемой.

Если вы гуглите это, вы найдете следующее:

начиная с iPhone 5S и iPad Air в 2013 году, все Apple С тех пор iPhone, iPad и iPod включают 64-битные чипы.

Согласно документации Swift: ссылка

Int В большинстве случаев вам не нужно выбирать определенный размер целого числа использовать в вашем коде. Swift предоставляет дополнительный целочисленный тип, Int, имеет тот же размер, что и собственный размер слова текущей платформы:

На 32-битной платформе Int имеет тот же размер, что и Int32.

На 64-битной платформе Int имеет тот же размер, что и Int64.

Если вам не нужно работать с определенным размером целого числа, всегда используйте Int для целочисленных значений в вашем коде. Это помогает согласованности кода и совместимость. Даже на 32-битных платформах Int может хранить любое значение от -2 147 483 648 до 2 147 483 647 и достаточно велика для многих целочисленные диапазоны.

Ваше значение находится вне 32-битного диапазона Int?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...