API 不包含某些对象的任何值,并且 Xcode 在运行应用程序时会出现致命错误

Posted

技术标签:

【中文标题】API 不包含某些对象的任何值,并且 Xcode 在运行应用程序时会出现致命错误【英文标题】:API doesn't contain any value for some objects and Xcode gives a fatal error when running the app 【发布时间】:2016-05-24 19:26:38 【问题描述】:

我的应用从这个 API 获取一些数据:https://api.jqestate.ru/v1/properties/country

我的项目的 GitHub 链接:https://github.com/armansharvel/JQ-Estate.git(下载分支“刷新”)

没有编译器错误,但是当我在模拟器中运行我的应用程序时,Xcode 在控制台中打印“致命错误:索引超出范围”。

在 ObjectModel.swift 中,我创建了一个包含一些数据类型的对象类。其中之一是变量 mainPic(我也想从 API 获取的 TableVeiw 图片的 URL)。但问题不是API中的每个对象都包含图片的URL值。

所以 Xcode(当我尝试运行应用程序时)标记了初始化 mainPic 变量的代码块的第二行,错误是:“线程 7:EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0)”

这是整个类的代码:

import Foundation

class Houses 

// Data Encapsulation

private var _mainPic: String
private var _localityName: String
private var _routeName: String
private var _mkadDistance: String
private var _rentOffer: String
private var _saleOffer: String

// Make a getted

var mainPic: String 
    return _mainPic


var localityName: String 
    return _localityName


var routeName: String 
    return _routeName


var mkadDistance: String 
    return _mkadDistance


var rentOffer: String 
    return _rentOffer


var saleOffer: String 
    return _saleOffer


// Initialization

init(data: JSONDictionary) 

    // Main Picture

    if let images = data["images"] as? JSONArray,
        pic0 = images[0] as? JSONDictionary, // THIS LINE IS WITH ERROR
        mainPic = pic0["url"] as? String 
        self._mainPic = mainPic
     else 
        _mainPic = ""
    

    // Locality Name

    if let location = data["location"] as? JSONDictionary,
        localityName = location["localityName"] as? String 
        self._localityName = localityName
     else 
        _localityName = ""
    

    // Route Name

    if let location = data["location"] as? JSONDictionary,
        routeName = location["routeName"] as? String 
        self._routeName = routeName
     else 
        _routeName = ""
    

    // MKAD Distance

    if let location = data["location"] as? JSONDictionary,
        mkadDistance = location["mkadDistance"] as? String 
        self._mkadDistance = mkadDistance
     else 
        _mkadDistance = ""
    

    // Rent Offer

    if let rentDict = data["rentOffer"] as? JSONDictionary,
        rentOffer = rentDict["price"] as? String 
        self._rentOffer = rentOffer
     else 
        _rentOffer = ""
    

    // Sale Offer

    if let saleDict = data["saleOffer"] as? JSONDictionary,
        saleOffer = saleDict["price"] as? String 
        self._saleOffer = saleOffer
     else 
        _saleOffer = ""
    


以防万一,JSONDictionary 和 JSONArray 只是类型别名:

typealias JSONDictionary = [String : AnyObject]

typealias JSONArray = Array<AnyObject>

提前致谢!

【问题讨论】:

【参考方案1】:

如果images 数组为空,images[0] 将崩溃并显示“致命错误:索引超出范围”。

由于您使用的是可选绑定,因此请使用first 而不是[0]

if let images = data["images"] as? JSONArray,
    pic0 = images.first as? JSONDictionary,
    mainPic = pic0["url"] as? String 
    self._mainPic = mainPic
 else 
    _mainPic = ""

【讨论】:

以上是关于API 不包含某些对象的任何值,并且 Xcode 在运行应用程序时会出现致命错误的主要内容,如果未能解决你的问题,请参考以下文章

xcode 5中的导航栏对象不显示后退按钮并且没有功能

为啥索引不用于某些值?

损坏的 CORBA 对象引用

如果涉及访问外部API(域驱动设计),我应该在哪里放置值对象创建逻辑]] << [

Xcode 4.3 停止构建 XIB 文件

Xcode 代码链接错误始终显示“对象:退出”并且无法更改连接类型