Qual è il modo migliore per sapere quando ho raggiunto l'ultimo oggetto in una matrice quando si utilizza l'enumerazione rapida? C'è un modo migliore di incrementare un int e quindi confrontarlo con la lunghezza della matrice?Obiettivo C: ultimo oggetto quando si utilizza l'enumerazione veloce?
risposta
Se si inizia con una serie uscire l'ultimo elemento (c'e' s una chiamata specifica per quello) e confrontare ogni elemento che si ottiene nell'enumeratore contro quello. Qualcosa di simile:
id lastEl = [myArray lastObject];
for (id anEl in myArray)
{
if (anEl == lastEl)
..... // do the last thing
}
Il costo confronto è lo stesso con il contatore, ma poi non si ha il costo di incrementare il contatore o errori che inevitabilmente sorgono quando si dimentica di incrementare il contatore.
Non credo che ci sia un modo (semplice) per farlo: è uno dei compromessi dell'utilizzo dell'enumerazione veloce. Pertanto, quando è necessario essere a conoscenza dell'indice dell'elemento su cui si sta enumerando, sarà necessario creare un numero intero come suggerito.
Detto questo, ci si può comunque trarre vantaggio dal fatto che non si può andare fuori dai limiti quando si utilizza un enumeratore veloce, ecc
In genere, veloce enumerazione significa che non si utilizza un contatore ...
l'altra forma è senza un contatore è ...
NSEnumerator *enumerator = [objectSet objectEnumerator];
id setObject;
while ((setObject = [enumerator nextObject]) != nil)
{
...
}
Se il test delle prestazioni è responsabile here, non c'è molta differenza di prestazioni tra l'enumerazione veloce e l'enumerazione dei blocchi. O bbum said here "L'enumerazione basata su blocchi consente alla classe di raccolta di enumerare i contenuti tanto velocemente quanto il più veloce traversamento del formato di archiviazione nativo."
Quindi suggerirò di utilizzare l'enumerazione dei blocchi in modo da ottenere indice e oggetto allo stesso tempo tempo, e puoi fare il confronto.
È anche possibile utilizzare l'enumerazione con blocchi:
[myArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
BOOL isLastObject = idx == [myArray count]-1;
if (isLastObject){
//...
}
}];
Se si sa quale tipo di oggetti vostro array contiene è meglio sostituire id
con la classe corretta.
- 1. Obiettivo-c: corrispondenza ricerca fuzzy veloce
- 2. Obiettivo c - Proprietà oggetto unico NSMutableSet
- 3. Obiettivo c UIPageViewController rimuove l'ombra quando si gira
- 4. EntryPointNotFoundException quando si utilizza TaskDialog in C#
- 5. TypeInitializationException quando si utilizza swig per C#
- 6. Quando si utilizza ANTLR
- 7. miscelazione obiettivo-c e rapido quando sottoclasse
- 8. migliori pratiche quando si utilizza httplib2.Http() oggetto
- 9. C#: Come accedere a una condivisione quando si utilizza DirectoryInfo
- 10. Modifica raccolta quando si utilizza un ciclo foreach in C#
- 11. "ERRORE MSB4040 Non v'è alcun obiettivo nel progetto" quando si utilizza msbuild + Delphi2009
- 12. quando si utilizza knitr
- 13. Quando si utilizza CFRelease?
- 14. obiettivo c confronto linee si intersecano
- 15. Nascondi quando si utilizza Exec()
- 16. Obiettivo C - Classe KeyValuePair?
- 17. accesso all'oggetto globale quando si utilizza requirejs
- 18. Obiettivo C: metodo preferito per creare e inizializzare un oggetto
- 19. Obiettivo C quando utilizzare alloc e quando non su
- 20. Sbarazzarsi di \ n quando si utilizza .readlines()
- 21. CGContextFillRects: Invalid contesto - Obiettivo C
- 22. Obiettivo C - Test unitario e oggetto di simulazione?
- 23. Aggiungere oggetti aggiuntivi quando si utilizza ItemsSource
- 24. Ottieni NSManagedObjectContext quando si utilizza Storyboard
- 25. Pulsante Elimina iOS - Obiettivo C
- 26. Citazioni quando si utilizza grep?
- 27. Attenzione quando si utilizza Reachability.h
- 28. NoClassDefFoundError quando si utilizza Powermock
- 29. Problema quando si utilizza MFMailComposeViewController
- 30. CancellationException quando si utilizza ExecutorService
Sono d'accordo con questo, ma credo che sia "lastObject" non "lastElement". – slycrel
Bene, ora tu e io siamo d'accordo! Questo è quello che ottengo per non controllare i documenti dell'SDK per la chiamata. –
Ottima risposta e proprio quello che stavo cercando! –