2016-10-01 4 views
0

에서 나는 이것을 변경하려고 : swift3에서 작동 뭔가에는 자 NSPredicate는 Swift3

return [self.allAttributes filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(UICollectionViewLayoutAttributes *layoutAttributes, NSDictionary *bindings) { 
     return CGRectIntersectsRect(rect, layoutAttributes.frame); 
     }]]; 

. 나는 하루 종일 검색 한

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

allAttributesNSArray으로 표시한다고 가정합니다. 어쨌든 그런

이 같은 것을 쓸 수 있도록, 당신은 어떤 캐스팅이 필요합니다

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