Type 'Int' does not conform to protocol 'NSCopying'

577 Views Asked by At

I'm using this Custom Collection View Layout implementation. I'm able to run the example in that repo just fine, but when I copy the CustomCollectionViewLayout.swift into my own project, I get a Type 'Int' does not conform to protocol 'NSCopying' error on the method

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

where var itemAttributes is an NSMutableArray!

The error is being generated by the second index, [indexPath.row].

Any ideas? I've tried putting the same function in a swift playground and did not get any errors..

Updated! This is a swiftstub w/ my playground saved in it. It doesn't execute because of the Import UIKit, but the following:

let x = collectionViewLayout.itemAttributes[indexPath.section]
let y = collectionViewLayout.itemAttributes[indexPath.section][indexPath.row]
print( "x's type = \(_stdlib_getDemangledTypeName(x))")
print("x = \(x)")
print( "y's type = \(_stdlib_getDemangledTypeName(y))")
print("y = \(y)")

yields:

x's type = __NSArrayM
x = (
    "<UICollectionViewLayoutAttributes: 0x7fbe6ac041d0> index path: (<NSIndexPath: 0xc000000000000016> {length = 2, path = 0 - 0}); frame = (0 0; 66 30); zIndex = 1024; ",
    "<UICollectionViewLayoutAttributes: 0x7fbe6ac05030> index path: (<NSIndexPath: 0xc000000000200016> {length = 2, path = 0 - 1}); frame = (65 0; 63 30); zIndex = 1023; ",
    "<UICollectionViewLayoutAttributes: 0x7fbe6ae1e2a0> index path: (<NSIndexPath: 0xc000000000400016> {length = 2, path = 0 - 2}); frame = (127 0; 65 30); zIndex = 1023; ",
    "<UICollectionViewLayoutAttributes: 0x7fbe6ac06830> index path: (<NSIndexPath: 0xc000000000600016> {length = 2, path = 0 - 3}); frame = (191 0; 66 30); zIndex = 1023; ",
    "<UICollectionViewLayoutAttributes: 0x7fbe6ae21e50> index path: (<NSIndexPath: 0xc000000000800016> {length = 2, path = 0 - 4}); frame = (256 0; 67 30); zIndex = 1023; ",
    "<UICollectionViewLayoutAttributes: 0x7fbe6ad70f30> index path: (<NSIndexPath: 0xc000000000a00016> {length = 2, path = 0 - 5}); frame = (322 0; 66 30); zIndex = 1023; ",
    "<UICollectionViewLayoutAttributes: 0x7fbe6ac054e0> index path: (<NSIndexPath: 0xc000000000c00016> {length = 2, path = 0 - 6}); frame = (387 0; 66 30); zIndex = 1023; ",
    "<UICollectionViewLayoutAttributes: 0x7fbe6ad72420> index path: (<NSIndexPath: 0xc000000000e00016> {length = 2, path = 0 - 7}); frame = (452 0; 65 30); zIndex = 1023; "
)
y's type = Swift.ImplicitlyUnwrappedOptional<Swift.AnyObject>
y = <UICollectionViewLayoutAttributes: 0x7fbe6ac041d0> index path: (<NSIndexPath: 0xc000000000000016> {length = 2, path = 0 - 0}); frame = (0 0; 66 30); zIndex = 1024; 
1

There are 1 best solutions below

1
On BEST ANSWER

change override func layoutAttributesForItemAtIndexPath to

override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? { let row = indexPath.row let x : NSMutableArray = self.itemAttributes[indexPath.section] as! NSMutableArray let l = x[row] as? UICollectionViewLayoutAttributes return l }

I'll fork CustomCollectionLayoutView later today and make a swift2 copy