Swift3 中的 NSPredicate

Posted

技术标签:

【中文标题】Swift3 中的 NSPredicate【英文标题】:NSPredicate in Swift3 【发布时间】: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'

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

【问题讨论】:

【参考方案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)

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

【讨论】:

以上是关于Swift3 中的 NSPredicate的主要内容,如果未能解决你的问题,请参考以下文章

Swift3 中的 NSPredicate

Swift3 中的 UIView 动画

swift3中的嵌套数组? [关闭]

UICollectionView在Swift3.0中的用法

Swift3:使用外部数据库中的数据填充 UITableView?

如何使用 Swift3 访问 CoreData 中的数据索引