2016-10-01 54 views
0

我試圖改變這一點:NSPredicate在Swift3

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'

我一直在尋找了一整天,但我不能找到一個解決方案。

回答

0

假設您的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,你爲什麼不聲明爲雨燕陣列,[UICollectionViewLayoutAttributes]

var allAttributes: [UICollectionViewLayoutAttributes] = [] 

//... 

    return allAttributes.filter {rect.intersects($0.frame)} 

根據此更改,您可能需要一些修復,但通常這些修復會使您的代碼更加簡單易讀。

+0

它的工作原理。謝謝 – mat