2016-04-07 87 views
0

所以我轉換這行代碼不能類型的值轉換爲預期的參數類型

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(TidyFeed * _Nonnull item, NSDictionary<NSString *,id> * _Nullable bindings) { 
     return ![item.feedEntryId isEqualToString:feedEntryId]; 
    }]; 

到SWIFT代碼

var predicate = NSPredicate { (item: TidyFeed, bindings: NSDictionary) in 
     return !(item.feedEntryId == feedEntryId) 
    } 

,但我得到這個錯誤

無法將類型'(TidyFeed,NSDictionary) - > Bool'的值轉換爲期望的參數類型'(AnyObject,[String:AnyObject]?) - > Bool'

有沒有人在使用塊時遇到此錯誤?

附加信息

斯威夫特代碼

apiClient.dismissFeed(feedEntryId, completion: {(responseObject: AnyObject, error: NSError) -> Void in 

    }) 

錯誤

無法將類型的價值 '(AnyObject,NSError) - >虛空' 預期參數類型「AFAPIOperationCompletionBlock! 「

和這裏的的完成塊碼AFAPIOperationCompletionBlock

- (void) completion:(id)responseObject error:(NSError *)error 

回答

0

在Objective-C,第一參數封閉 的id evaluatedBlock可以通過任何對象的指針被取代,如TidyFeed *,而且 是一種避免額外指針轉換的已知方法,如果您確實知道評估對象實際上是該類型的。

斯威夫特但是不允許這一點,你必須投出塊內的指針 :

let predicate = NSPredicate { (item: AnyObject, _) -> Bool in 
    return (item as! TidyFeed).feedEntryId != feedEntryId 
} 

這會崩潰,如果該塊被調用的對象是不是類型TidyFeed的 。一個安全版本是

let predicate = NSPredicate { (item: AnyObject, _) -> Bool in 
    if let feed = item as? TidyFeed { 
     return feed.feedEntryId != feedEntryId 
    } else { 
     return false 
    } 
} 

與可選的演員。這可以更緊湊寫成:

let predicate = NSPredicate { (item: AnyObject, _) -> Bool in 
    return (item as? TidyFeed)?.feedEntryId != feedEntryId 
} 

注意你也可以如何使用通配符模式_將未使用的 bindings參數。

相關問題