2015-10-29 1 views
6

Ich schrieb iOS-Anwendung mit Swift 2.0 auf xcode 7.0. Vor dem Update auf die letzte Version von xCode 7.1 exakt das gleiche Code funktionierte perfektMehrdeutige Verwendung von "tiefgestellt" - IOS 9 Swift 2.0

Nach dem Update bekam ich diese Fehlermeldung:

Ambiguous use of 'subscript'

in diese Richtung:

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

dies ist die vollständige Klasse:

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

Antwort

7

Der Compiler weiß nicht, was von self.itemAttributes[indexPath.section] zurückgegeben wird, da es als NSMutableArray definiert ist. Stattdessen sollten Sie itemAttributes als Array Array von UICollectionViewLayoutAttributes definieren, so wie es aussieht. Also sollte sich itemAttributes: [[UICollectionViewLayoutAttributes]] um diese Warnung kümmern und wäre die bevorzugte Art, das in Swift zu schreiben.

Bearbeiten: Sie sollten auch sectionAttributes als [UICollectionViewLayoutAttributes] neu definieren. Nun kann der Compiler den Objekttyp, der für das Subscripting zurückgegeben wird, vollständig ableiten.

Warum es in der letzten Version geändert wurde, bin ich mir nicht sicher, ich sehe nichts speziell in den Versionshinweisen.

+0

noch denselben Fehler in gleichen Zeilen – MBH

+0

und Warum Dieser Fehler trat nach dem Update auf den letzten xcode! – MBH

+0

Antwort aktualisiert. –

7

Antwort 'Peter Foti' Bezug genommen, ich habe Code geändert

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

Statt Linie mit Fehler ‚mehrdeutige Verwendung von 'Index'

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