2015-10-29 17 views
6

Stavo scrivendo app ios usando Swift 2.0 su xcode 7.0. Prima di aggiornare all'ultima versione di xCode 7.1 lo stesso codice esatto stava lavorando perfettamenteUso ambiguo di 'subscript' - ios 9 Swift 2.0

Dopo l'aggiornamento ho ottenuto questo errore:

Ambiguous use of 'subscript'

in quelle righe:

override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> (UICollectionViewLayoutAttributes!) { 
    return self.itemAttributes[indexPath.section][indexPath.row] as! UICollectionViewLayoutAttributes 
    } 

questa è la piena classe:

class CustomCollectionViewLayout: UICollectionViewLayout { 

    var numberOfColumns = 7 // the number of columns 
    var itemAttributes : NSMutableArray! 
    var itemsSize : NSMutableArray! 
    var contentSize : CGSize! 

    func setColumnNumber(columnNum: Int) { 
    numberOfColumns = columnNum 
    } 

    override func prepareLayout() { 
    if self.collectionView?.numberOfSections() == 0 { 
     return 
    } 

    if (self.itemAttributes != nil && self.itemAttributes.count > 0) { 
     for section in 0..<self.collectionView!.numberOfSections() { 
     let numberOfItems : Int = self.collectionView!.numberOfItemsInSection(section) 
     for index in 0..<numberOfItems { 
      if section != 0 && index != 0 { 
      continue 
      } 

      let attributes : UICollectionViewLayoutAttributes = self.layoutAttributesForItemAtIndexPath(NSIndexPath(forItem: index, inSection: section)) 
      if section == 0 { 
      var frame = attributes.frame 
      frame.origin.y = self.collectionView!.contentOffset.y 
      attributes.frame = frame 
      } 

      if index == 0 { 
      var frame = attributes.frame 
      frame.origin.x = self.collectionView!.contentOffset.x 
      attributes.frame = frame 
      } 
     } 
     } 
     return 
    } 

    if (self.itemsSize == nil || self.itemsSize.count != numberOfColumns) { 
     self.calculateItemsSize() 
    } 

    var column = 0 
    var xOffset : CGFloat = 0 
    var yOffset : CGFloat = 0 
    var contentWidth : CGFloat = 0 
    var contentHeight : CGFloat = 0 

    for section in 0..<self.collectionView!.numberOfSections() { 
     let sectionAttributes = NSMutableArray() 

     for index in 0..<numberOfColumns { 
     let itemSize = self.itemsSize[index].CGSizeValue() 
     let indexPath = NSIndexPath(forItem: index, inSection: section) 
     let attributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath) 
     attributes.frame = CGRectIntegral(CGRectMake(xOffset, yOffset, itemSize.width, itemSize.height)) 

     if section == 0 && index == 0 { 
      attributes.zIndex = 1024; 
     } else if section == 0 || index == 0 { 
      attributes.zIndex = 1023 
     } 

     if section == 0 { 
      var frame = attributes.frame 
      frame.origin.y = self.collectionView!.contentOffset.y 
      attributes.frame = frame 
     } 
     if index == 0 { 
      var frame = attributes.frame 
      frame.origin.x = self.collectionView!.contentOffset.x 
      attributes.frame = frame 
     } 

     sectionAttributes.addObject(attributes) 

     xOffset += itemSize.width 
     column++ 

     if column == numberOfColumns { 
      if xOffset > contentWidth { 
      contentWidth = xOffset 
      } 

      column = 0 
      xOffset = 0 
      yOffset += itemSize.height 
     } 
     } 
     if (self.itemAttributes == nil) { 
     self.itemAttributes = NSMutableArray(capacity: self.collectionView!.numberOfSections()) 
     } 
     self.itemAttributes .addObject(sectionAttributes) 
    } 

    let attributes : UICollectionViewLayoutAttributes = self.itemAttributes.lastObject?.lastObject as! UICollectionViewLayoutAttributes 
    contentHeight = attributes.frame.origin.y + attributes.frame.size.height 
    if(contentWidth == 0 || contentHeight == 0){return;} 
    self.contentSize = CGSizeMake(contentWidth, contentHeight) 
    } 

    override func collectionViewContentSize() -> CGSize { 
    if(self.contentSize != nil){ 
     return self.contentSize 
    }else { 
     return CGSizeMake(0, 0) 
    } 
    } 

    override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> (UICollectionViewLayoutAttributes!) { 
    return self.itemAttributes[indexPath.section][indexPath.row] as! UICollectionViewLayoutAttributes 
    } 

    override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? { 
    var attributes = [UICollectionViewLayoutAttributes]() 
    if self.itemAttributes != nil { 
     for section in self.itemAttributes { 

     let filteredArray = section.filteredArrayUsingPredicate(

      NSPredicate(block: { (evaluatedObject, bindings) -> Bool in 
      return CGRectIntersectsRect(rect, evaluatedObject.frame) 
      }) 
     ) as! [UICollectionViewLayoutAttributes] 


     attributes.appendContentsOf(filteredArray) 

     } 
    } 

    return attributes 
    } 

    override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool { 
    return true 
    } 

    func sizeForItemWithColumnIndex(columnIndex: Int) -> CGSize { 
    let text : String = "25.10.15" 
    let size : CGSize = (text as NSString).sizeWithAttributes([NSFontAttributeName: UIFont.systemFontOfSize(17.0)]) 
    let width : CGFloat = size.width + 25 
    return CGSizeMake(width, 30) 
    } 

    func calculateItemsSize() { 
    self.itemsSize = NSMutableArray(capacity: numberOfColumns) 
    for index in 0..<numberOfColumns { 
     self.itemsSize.addObject(NSValue(CGSize: self.sizeForItemWithColumnIndex(index))) 
    } 
    } 
} 

The original library

risposta

7

Il compilatore non sa cosa viene restituito da self.itemAttributes[indexPath.section] poiché è definito come NSMutableArray. Invece dovresti definire itemAttributes come una matrice di array di UICollectionViewLayoutAttributes che è quello che sembra avere. Quindi, itemAttributes: [[UICollectionViewLayoutAttributes]] dovrebbe occuparsi di tale avviso e sarebbe il modo preferito di scrivere quello in Swift.

Modifica: è inoltre necessario ridefinire sectionAttributes come [UICollectionViewLayoutAttributes]. Così ora il compilatore può dedurre completamente il tipo di oggetto che viene restituito per l'indice.

Per quanto riguarda il motivo per cui è stato modificato nella recente versione, non sono sicuro, non vedo nulla a riguardo in particolare nelle note di rilascio.

+0

ancora lo stesso errore nel stesse linee – MBH

+0

e Perché questo errore è apparso dopo l'aggiornamento all'ultimo Xcode!? – MBH

+0

Risposta aggiornata. –

7

Riferendosi risposta 'Pietro Foti', ho cambiato il codice per

let sectionAttributes = self.itemAttributes [indexPath.section] as! [UICollectionViewLayoutAttributes] 
return sectionAttributes[indexPath.row] as UICollectionViewLayoutAttributes 

Invece di linea con l'errore 'uso ambiguo di 'pedice'

return self.itemAttributes[indexPath.section][indexPath.row] as! UICollectionViewLayoutAttributes