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 在运行应用程序时会出现致命错误的主要内容,如果未能解决你的问题,请参考以下文章