Ios 致命错误:在使用Swift展开可选值时意外发现nil
我正在尝试在Swift中实现Ios 致命错误:在使用Swift展开可选值时意外发现nil,ios,swift,Ios,Swift,我正在尝试在Swift中实现UICollectionView 关于第let array=objects.objectForKey(“image\u url”)行中的可选值作为[String] 我不知道这是怎么回事,我的代码 ViewController.swift import UIKit var data: [String] = [] ; class ViewController: UICollectionViewController{ override func viewDidLoad
UICollectionView
关于第let array=objects.objectForKey(“image\u url”)行中的可选值作为[String]
我不知道这是怎么回事,我的代码
ViewController.swift
import UIKit
var data: [String] = [] ;
class ViewController: UICollectionViewController{
override func viewDidLoad() {
super.viewDidLoad()
var collectionView: UICollectionView
let json = "https://api.photozou.jp/rest/search_public.json?keyword=bike"//"http://dl.dropboxusercontent.com/u/7817937/nameko.json"
let uri = NSURL(string: json)
let uridata = NSData(contentsOfURL: uri)
let objects = uridata.objectFromJSONData() as NSDictionary
let array = objects.objectForKey("image_url") as [String]
data += array
//println(array)
}
override func numberOfSectionsInCollectionView(collectionView: UICollectionView?) -> Int {
return 1
}
override func collectionView(collectionView: UICollectionView?, numberOfItemsInSection section: Int) -> Int {
return data.count
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
var cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as CollectionViewCell
let url = NSURL(string: data[indexPath.row])
cell.image.setImageWithURL(url, placeholderImage: nil)
return cell
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
有人对此错误有解决方案吗?您可以通过以下方式避免崩溃:
if objects != nil
{
if objects.objectForKey("image_url") != nil
{
let array = objects.objectForKey("image_url") as [String]
data += array
}
}
您可以像这样避免崩溃:
if objects != nil
{
if objects.objectForKey("image_url") != nil
{
let array = objects.objectForKey("image_url") as [String]
data += array
}
}
错误在这里:
let array = objects.objectForKey("image_url") as [String]
字典总是返回一个可选值,可以是nil
,但您也在对字符串数组进行强制转换。错误可能由以下任一原因引起:
- 字典没有带
image\u url
键的值(objectForKey
返回nil
)
- 字典中有该键的值,但它不是
数组
我将这一行(以及下一行)改为:
如果image\u url
键没有值,或者其值**不是*字符串数组,则第一行不会崩溃。可选绑定确保仅当array
不是nil
时才执行data+=array
(它还从可选变量中打开数组)错误如下:
let array = objects.objectForKey("image_url") as [String]
字典总是返回一个可选值,可以是nil
,但您也在对字符串数组进行强制转换。错误可能由以下任一原因引起:
- 字典没有带
image\u url
键的值(objectForKey
返回nil
)
- 字典中有该键的值,但它不是
数组
我将这一行(以及下一行)改为:
如果image\u url
键没有值,或者其值**不是*字符串数组,则第一行不会崩溃。可选绑定确保仅当array
不是nil
时才执行data+=array
(并且它还从可选变量中打开数组)是否验证了收到的JSON数据?对象不是零吗?objects.objectForKey(“image_url”)是字符串数组吗?是的,object不是nil和String。您是否验证了收到的JSON数据?对象不是零吗?objects.objectForKey(“image_url”)是字符串数组吗?是的,对象不是nil和String。注意:1。第一个if
是多余的,因为有一个显式强制转换到NSDictionary
(如果为nil或不是dictionary,则例外);2.它不处理该键的值不是数组的情况strings@Antonio谢谢你的评论。我不太擅长斯威夫特。但我可以肯定的是,这段代码会让崩溃消失,但事实并非如此——如果objects[“image\u url”]
不是字符串数组,它会生成一个运行时exception@Antonio是的,你是对的,但我的意思是“在展开可选值时意外地发现了零”,更准确地说,致命错误:在展开可选值时意外发现nil
可替换为另一个运行时错误注意:1。第一个if
是多余的,因为有一个显式强制转换到NSDictionary
(如果为nil或不是dictionary,则例外);2.它不处理该键的值不是数组的情况strings@Antonio谢谢你的评论。我不太擅长斯威夫特。但我可以肯定的是,这段代码会让崩溃消失,但事实并非如此——如果objects[“image\u url”]
不是字符串数组,它会生成一个运行时exception@Antonio是的,你是对的,但我的意思是“在展开可选值时意外地发现了零”,更准确地说,致命错误:在展开可选值时意外发现nil
可被另一个运行时错误替换