2016-10-01 53 views
0

我试图改变这一点:NSPredicate在Swift3

return [self.allAttributes filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(UICollectionViewLayoutAttributes *layoutAttributes, NSDictionary *bindings) { 
     return CGRectIntersectsRect(rect, layoutAttributes.frame); 
     }]]; 

到的东西,在swift3工作。到目前为止,我已经试过这样:

return self.allAttributes?.filtered(using: NSPredicate(block: { (layoutAttributes, bindings) -> Bool in 
     return rect.intersects(layoutAttributes.frame) 

    })) as! [UICollectionViewLayoutAttributes]? 

但当然,我得到Value of type 'Any?' has no member 'frame'

我一直在寻找了一整天,但我不能找到一个解决方案。

回答

0

假设您的allAttributes被宣布为NSArray

然后反正,你需要一些铸造,所以你可以写这样的事情:

return self.allAttributes?.filtered(using: NSPredicate(block: { (layoutAttributes, bindings) -> Bool in 
     guard let layoutAttributes = layoutAttributes as? UICollectionViewLayoutAttributes else { 
      print("some thing is wrong...") 
      return false 
     } 
     return rect.intersects(layoutAttributes.frame) 

    })) as! [UICollectionViewLayoutAttributes]? 

但是如果你只包含UICollectionViewLayoutAttributes,你为什么不声明为雨燕阵列,[UICollectionViewLayoutAttributes]

var allAttributes: [UICollectionViewLayoutAttributes] = [] 

//... 

    return allAttributes.filter {rect.intersects($0.frame)} 

根据此更改,您可能需要一些修复,但通常这些修复会使您的代码更加简单易读。

+0

它的工作原理。谢谢 – mat