无法使用Int类型下标类型'[NSIndexPath]'的值

时间:2015-09-05 02:22:47

标签: ios swift uicollectionview

所以我目前正在使用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

    }
}

3 个答案:

答案 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]
}