将enumerateObjectsUsingBlock转换为快速枚举 - Swift

时间:2014-08-28 11:50:33

标签: ios objective-c swift enumerate fast-enumeration

我想知道如何将以下内容转换为Swift。我试过了,但却陷入了一个概念:

我使用属性 UICollectionViewLayoutAttributes

循环遍历所有对象
[newVisibleItems enumerateObjectsUsingBlock:^(UICollectionViewLayoutAttributes *attribute, NSUInteger idx, BOOL *stop) {
    UIAttachmentBehavior *spring = [[UIAttachmentBehavior alloc] initWithItem:attribute attachedToAnchor:attribute.center];
    spring.length = 0;
    spring.frequency = 1.5;
    spring.damping = 0.6;

    [_animator addBehavior:spring];
    [_visibleIndexPaths addObject:attribute.indexPath];
}];

Swift:标记为 * 的变量出现错误:

for (index, attribute) in enumerate(newVisibleIems) {
    var spring:UIAttachmentBehavior = UIAttachmentBehavior(item: ***attribute***, attachedToAnchor: attribute.center)

    spring.length = 0
    spring.frequency = 1.5
    spring.damping = 0.6

    self.animator.addBehavior(spring)
    self.visibleIndexPaths.addObject(attribute.indexPath)
}

***输入' AnyObject'不符合协议' UIDynamicItem'

我认为这是因为我没有告诉商品属性这是一个UICollectionViewLayoutAttributes。但我不确定如何写这个?

基本上,如何将Objective C转换为Swift?

1 个答案:

答案 0 :(得分:1)

只要将newVisibleItems声明为[AnyObject],由于Swift的严格类型检查,您的代码将无法编译。

要确保newVisibleItems是一个预期类型的​​数组,您必须将for循环包装在一个向下转换中:

if let newVisibleItems = newVisibleItems as? [UIDynamicItem] {
    for (index, attribute) in enumerate(newVisibleItems) {
        ...
    }
}

如果这个错误的原因在UIKit内部,请确保Apple现在正在努力确保" swiftified"他们的框架版本返回一个正确的类型,而不是AnyObject! s。

的组合