2015-09-05 54 views
5

所以我目前使用的Xcode 7测试一个项目转换为斯威夫特2,和我目前得到的错误:无法下标类型为“[NSIndexPath]”的值与int类型

Cannot subscript a value of type '[NSIndexPath]?' with a type 'Int'

为下面的代码灵:

let indexPath = indexPaths[0] as! NSIndexPath 

试图当用户选择使用prepareForSegue方法在UICollectionView小区将数据传递到一个视图控制器时。

这里是完整的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 

    } 
} 
+1

尝试做'let indexPaths = self.collectionView.indexPathsForSelectedItems()as! [NSIndexPath]' –

+0

@TheBeanstalk是啊,这似乎现在做的伎俩,仍然转换代码,无法运行atm。 'let indexPaths = self.collectionView.indexPathsForSelectedItems()as [NSIndexPath]!' – RileyDev

+0

如果您单独保留'indexPaths'这行,而将'let indexPath = indexPaths![0]改为! NSIndexPath' –

回答

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阵列因为目的-C支持简单的泛型。

所以,

  • 你必须解开它。
  • 你并不需要将它们转换为NSIndexPath

尝试:

let indexPaths = self.collectionView.indexPathsForSelectedItems()! 
let indexPath = indexPaths[0] 
2

首先,你应该解开阵列然后用它所以这段代码应该工作:

let indexPath = indexPaths?[0] as! NSIndexPath 

通过的方式,避免使用!打开有可能为零的变量或最终的应用程序将面临运行时崩溃。

0

您需要展开数组,而不是强制展开!如果让我们确保你没有展开nil,可能会更安全

if let indexPaths = self.collectionView.indexPathsForSelectedItems() where indexPaths.count > 0{ 
    let indexPath = indexPaths[0] 
} 
相关问题