2015-09-05 8 views
5

Così sto attualmente conversione di un progetto di Swift 2 utilizzando Xcode 7 beta, e attualmente sto ottenendo l'errore:Non può indicizzare un valore di tipo '[NSIndexPath]' con un tipo Int

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

per il seguente ling di codice:

let indexPath = indexPaths[0] as! NSIndexPath 

quando si tenta di passare dati a un controllore vista quando un utente seleziona una cella in UICollectionView utilizzando prepareForSegue metodo.

Ecco il metodo prepareForSegue completo. Non sono sicuro che si tratti di un errore di Swift 2, ma funziona correttamente quando si utilizza Swift 1.1 per 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

Prova a fare 'lasciare indexPaths = self.collectionView.indexPathsForSelectedItems() come! [NSIndexPath] ' –

+0

@TheBeanstalk yeah questo sembrava fare il trucco per ora, convertendo ancora codice e incapace di eseguire atm. 'let indexPaths = self.collectionView.indexPathsForSelectedItems() come [NSIndexPath]!' – RileyDev

+0

Potrebbe anche funzionare se si lascia la riga 'indexPaths' da solo, e invece di fare' allow indexPath = indexPaths! [0] as! NSIndexPath' –

risposta

1

In iOS 8 SDK, indexPathsForSelectedItems è dichiarato come:

func indexPathsForSelectedItems() -> [AnyObject] // returns nil or an array of selected index paths 

Questo è stato un bug nel SDK perché indexPathsForSelectedItems() rendimenti nil quando non ci sono elementi selezionati.

In iOS9 SDK, che viene dichiarata come:

public func indexPathsForSelectedItems() -> [NSIndexPath]? 

2 differenze qui

  • Il bug è stato fissato, e restituisce Optional
  • restituisce un array di NSIndexPath invece di AnyObject dal Obiettivo -C supporta semplici generici.

Quindi,

  • Devi scartarlo.
  • Non è necessario di gettarli a NSIndexPath

Prova:

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

primo luogo si dovrebbe scartare gamma quindi utilizzare in modo questo codice dovrebbe funzionare:

let indexPath = indexPaths?[0] as! NSIndexPath 

By il modo, evitare di usare! per scartare le variabili che hanno la possibilità di essere nul o la tua app finale dovrà affrontare crash in fase di esecuzione.

0

È necessario scartare l'array ma invece forzare lo scartare con! potrebbe essere più sicuro da usare se lasciare per assicurarsi che non si è Scartare nil

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