【问题标题】:NSPredicate in Swift3Swift3 中的 NSPredicate
【发布时间】:2016-10-01 21:01:42
【问题描述】:

我正在尝试改变这一点:

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'

我已经搜索了一整天,但找不到解决方案。

【问题讨论】:

    标签: nspredicate swift3 uicollectionviewlayout


    【解决方案1】:

    假设您的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,为什么不将它声明为Swift Array,[UICollectionViewLayoutAttributes]

    var allAttributes: [UICollectionViewLayoutAttributes] = []
    
    //...
    
        return allAttributes.filter {rect.intersects($0.frame)}
    

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

    【讨论】:

      猜你喜欢
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多