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

Ril*_*Dev 5 ios uicollectionview swift

所以我目前正在使用Xcode 7 beta将项目转换为Swift 2,我目前收到的错误是:

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

对于以下代码:

let indexPath = indexPaths[0] as! NSIndexPath
Run Code Online (Sandbox Code Playgroud)

当用户在UICollectionViewusing 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

    }
}
Run Code Online (Sandbox Code Playgroud)

rin*_*aro 1

在iOS8 SDK中,indexPathsForSelectedItems声明为:

func indexPathsForSelectedItems() -> [AnyObject] // returns nil or an array of selected index paths
Run Code Online (Sandbox Code Playgroud)

这是 SDK 中的一个错误,因为当没有选定的项目时indexPathsForSelectedItems()会返回。nil

在iOS9 SDK中,声明为:

public func indexPathsForSelectedItems() -> [NSIndexPath]?
Run Code Online (Sandbox Code Playgroud)

这里有2个区别

  • bug已修复,并返回Optional
  • 返回一个数组NSIndexPath而不是AnyObject因为 Objective-C 支持简单的泛型。

所以,

  • 你必须把它拆开。
  • 你不需要将它们投射到NSIndexPath

尝试:

 let indexPaths = self.collectionView.indexPathsForSelectedItems()!
 let indexPath = indexPaths[0]
Run Code Online (Sandbox Code Playgroud)