UIDynamicAnimator items(in:) 在 iOS 11 中崩溃

UIDynamicAnimator items(in:) crashes in iOS 11

在 iOS 11 (Xcode 9 beta 5) 中,我正在调用 UIDynamicAnimator 的 items(in:) 方法并立即崩溃:

NSArray element failed to match the Swift Array Element type

怎么回事?

您发现了一个错误。 (由 Apple 提交,雷达 33979954。)希望它能尽快修复,但在那之前,这里是修复:

extension UIDynamicAnimator {
    func views(in rect: CGRect) -> [UIView] {
        let nsitems = self.items(in: rect) as NSArray
        return nsitems.flatMap{[=10=] as? UIView}
    }
}

现在调用 view(in:) 而不是 items(in:),一切都会好起来的。

问题是将虚假对象放入从 items(in:) 返回的数组中。由于这些虚假对象,数组无法跨过从 Objective-C 到 Swift 的桥;返回的数组在 Swift 中输入为 [UIDynamicItem],但该数组包含的内容不是 UIDynamicItem 对象。

扩展通过不过桥来解决这个问题。我们留在 NSArray Objective-C 世界中,过滤掉虚假对象,然后 然后 过桥。