2016-04-07 4 views
0

So Code, um diese Linie von Ich bin UmwandlungWert kann nicht vom Typ Typ erwartete Argument konvertieren

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

zu SWIFT-Code

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

aber ich bekomme diese Fehlermeldung

Can not Konvertiere den Wert vom Typ '(TidyFeed, NSDictionary) -> Bool' in den erwarteten Argumenttyp '(AnyObject, [String: AnyObject]?) -> Bool'

hat jemand diesen Fehler bei der Verwendung von Blöcken?

Zusätzliche Informationen

Swift Code

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

    }) 

Fehler

Wert kann nicht vom Typ umwandeln '(ANYOBJECT, NSError) -> Void' zu erwarteten Argumenttyp ‚AFAPIOperationCompletionBlock! "

und hier ist der Abschluss Blockcode von AFAPIOperationCompletionBlock

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

Antwort

0

In Objective-C, der erste Parameter id evaluatedBlock des Verschlusses kann von jedem Objektzeiger ersetzt werden, wie TidyFeed * und dass ist eine bekannte Methode, um zusätzliche Zeigerkonvertierung zu vermeiden, wenn Sie sicher sind, dass die ausgewerteten Objekte tatsächlich von diesem Typ sind.

Swift jedoch dies nicht zulässt, und Sie müssen den Zeiger in den Block geworfen:

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

Dies wird abstürzen, wenn der Block mit einem Objekt aufgerufen wird, die TidyFeed nicht vom Typ ist. Eine sichere Version ist

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

mit einer optionalen Besetzung. Dies kann kompakter geschrieben werden als:

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

Beachten Sie auch, wie Sie das Wildcard-Muster _ für die nicht genutzten bindings Parameter verwenden können.