2015-10-30 10 views
18

In Swift 2, sto ricevendo un errore:Swift: non può convertire il valore di tipo a @noescape mentre chiamata indexOf, dopo filtro mediante la funzione di filtro

Cannot convert value of type '[String:AnyObject]' to expected argument type '@noescape ([String:AnyObject])' throws -> Bool"

//today = NSDate() 
//array : [[String:AnyObject]] 
// I use if let because of we might now get element in the array matching our condition 

if let elementOfArray = array.filter({$0["id"] as? Int == anotherDictionary["matchID"] as? Int && ($0["nextFireDate"] as? NSDate)?.compare(today) == NSComparisonResult.OrderedAscending}).first { 

    let index = array.indexOf(elementOfArray) // error here 
} 

Quello che sto facendo di sbagliato? Non riesco a capire :/

Il mio obiettivo è trovare l'indice di quell'elemento, penso di aprirlo per soluzioni alternative, ma ovviamente questo è preferito, perché penso che sia la "strada giusta".

+0

Qual è il codice effettivo al posto di '...' assomiglia? Non so se è importante, ma potrebbe essere utile se qualcuno potesse copiare e incollare esattamente quello che hai in un parco giochi per vedere l'errore esatto. – nhgrif

+0

@nhgrif Penso che questo non abbia importanza, in poche parole questo codice trova esattamente una riga per corrispondenza chiave/valore del dizionario. –

+0

Probabilmente non ha importanza, ma Swift ci consente di compattare così tanto in così poco. Le domande dovrebbero essere tanto chiare quanto il problema esatto. Sto giocando con me stesso in un parco giochi. Possiamo rimuovere la totalità del 'se let' in realtà. Dovresti davvero semplificare questa domanda fino a dove solo la chiamata 'indexOf' e l'errore effettivo prodotto sono la domanda qui. – nhgrif

risposta

26

Il metodo indexOf su array Swift non accetta un oggetto di un tipo che corrisponde al tipo di matrice. Invece, ci vuole una chiusura. Quella chiusura prende un elemento del tipo dell'array e restituisce un bool.

Quindi, in effetti, non ci occupiamo (e non dovremmo) nemmeno di occuparci della chiamata filter a meno che non sia effettivamente necessario il array. Se stiamo solo cercando il primo oggetto che supera il test per il quale stai filtrando ... beh, passiamo lo stesso identico test a indexOf.

Quindi, per semplificare le cose, se abbiamo una serie di stringhe (e diciamo che sono tutte stringhe a singola lettera con molta ripetizione), e voglio trovare il primo indice della stringa "a", piuttosto che filtraggio della matrice fino a stringhe che sono "a", quindi trovare la prima stringa che passava quel test con il metodo first, e poi trovare l'indice di quell'oggetto esatto, invece, ho solo passo che prova nel metodo indexOf:

let letters: [String] = ["x", "y", "z", "a", "b", "c"] 

let index = letters.indexOf { 
    $0 == "a" 
} 

Per chiarezza, si appea rs che semplicemente passando un singolo elemento e cercando ciò funziona in alcuni casi. Probabilmente si basa sulla conformità al protocollo Equatable di Swift. Per esempio, ho potuto usare usato letters.indexOf("a") qui. Il compilatore sarebbe stato felice. Ovviamente, non tutti gli array sono composti per contenere elementi conformi a Equatable e l'array non può formulare ipotesi su come confrontare i suoi elementi. In questi casi, dovrai utilizzare l'esempio precedente di passare una chiusura. Vale probabilmente la pena notare che passare questa chiusura a indexOf anziché filtrare prima e chiamare lo indexOf sarà egregiamente più efficiente comunque, anche se l'array consente l'approccio letters.indexOf("a"). Se, ad esempio, avessi stringhe più complesse e volevo solo la prima stringa che iniziava con la lettera 'a', sarebbe molto, molto più efficiente di iniziare dal filtrare l'array originale a una serie di stringhe che iniziano con ' un'.

+0

quasi! Oh, sembra che questa sia la risposta. –

+2

Esistono due * metodi indexOf, uno che prende un elemento e uno che prende un predicato. '[" x "," y "," z "," a "," b "," c "]. indexOf (" a ")' compila senza problemi. –

+0

@ Martinin, ma questo non è un dizionario, almeno. –

Problemi correlati