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的主要内容,如果未能解决你的问题,请参考以下文章