所以我目前正在使用Xcode 7 beta将项目转换为Swift 2,我目前收到错误:
无法下标'[NSIndexPath]类型的值?'类型为'Int'
以下代码:
let indexPath = indexPaths[0] as! NSIndexPath
当用户使用UICollectionView
方法选择prepareForSegue
中的单元格时,尝试将数据传递到视图控制器。
这是完整的prepareForSegue
方法。我不确定这是否是Swift 2错误,但在使用Swift 1.1 for iOS 8.4时它可以正常工作。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "details" {
let vc = segue.destinationViewController as! DetailsViewController
let indexPaths = self.collectionView.indexPathsForSelectedItems()
let indexPath = indexPaths[0] as! NSIndexPath
let selectedItem = items[indexPath.row]
vc.selectedItem = selectedItem
}
}
答案 0 :(得分:2)
首先你应该打开数组然后使用它,这样代码应该可以工作:
let indexPath = indexPaths?[0] as! NSIndexPath
顺便说一句,避免使用!解开有机会成为零的变量或你的最终应用程序将面临运行时崩溃。
答案 1 :(得分:1)
在iOS8 SDK中,indexPathsForSelectedItems
声明为:
func indexPathsForSelectedItems() -> [AnyObject] // returns nil or an array of selected index paths
这是SDK中的一个错误,因为indexPathsForSelectedItems()
在没有选定项目时会返回nil
。
在iOS9 SDK中,声明为:
public func indexPathsForSelectedItems() -> [NSIndexPath]?
这里有2个不同
Optional
NSIndexPath
而不是AnyObject
的数组,因为Objective-C支持简单的泛型。所以,
NSIndexPath
尝试:
let indexPaths = self.collectionView.indexPathsForSelectedItems()!
let indexPath = indexPaths[0]
答案 2 :(得分:0)
您需要打开数组,而不是强制解包!如果让我们确保你不打开nil
,那么使用起来可能会更安全if let indexPaths = self.collectionView.indexPathsForSelectedItems() where indexPaths.count > 0{
let indexPath = indexPaths[0]
}