Se non è possibile ottenere un oggetto con objectAtIndex: da un NSSet, come si recuperano gli oggetti?Come ottenere un oggetto da un NSSet
risposta
Esistono diversi casi d'uso per un set. È possibile enumerare tramite (ad esempio con enumerateObjectsUsingBlock
o NSFastEnumeration), chiamare containsObject
per verificare l'appartenenza, utilizzare anyObject
per ottenere un membro (non casuale) o convertirlo in un array (in nessun ordine particolare) con allObjects
.
Un set è appropriato quando non si desidera duplicare, non si preoccupa per l'ordine e si desidera testare rapidamente l'iscrizione.
NSSet non ha un metodo objectAtIndex:
Prova allObjects chiamata che restituisce un NSArray di tutti gli oggetti.
hai idea se l'array restituito è ordinato? in altre parole, se io aggiungo oggetti al set usando "setByAddingObject", e ho usato "allObjects", sono? gli elementi dell'array ordinati nell'ordine ho aggiunto gli oggetti? – iosMentalist
ordina semplicemente l'array risultante con un NSSortPredicate e starai bene – Jason
Se ti interessa solo un oggetto specifico, usa l'approccio filteredSetUsingPredicate. – akw
NSSet utilizza il metodo isEqual: (che gli oggetti inseriti in quell'insieme devono eseguire l'override, in aggiunta, il metodo hash) per determinare se un oggetto si trova all'interno di esso.
Così, per esempio se si dispone di un modello di dati che definisce la sua unicità da un valore di id (per esempio la proprietà è:
@property NSUInteger objectID;
allora si sarebbe attuare IsEqual: come
- (BOOL)isEqual:(id)object
{
return (self.objectID == [object objectID]);
}
ed è possibile implementare l'hash:
- (NSUInteger)hash
{
return self.objectID; // to be honest, I just do what Apple tells me to here
// because I've forgotten how Sets are implemented under the hood
}
Quindi, è possibile ottenere un oggetto con tale ID (nonché controllare per se è nella NSSet) con:
MyObject *testObject = [[MyObject alloc] init];
testObject.objectID = 5; // for example.
// I presume your object has more properties which you don't need to set here
// because it's objectID that defines uniqueness (see isEqual: above)
MyObject *existingObject = [mySet member: testObject];
// now you've either got it or existingObject is nil
Ma sì, l'unico modo per ottenere qualcosa da un NSSet è da considerare quella che definisce la sua unicità, in primo luogo.
Non ho provato cosa è più veloce, ma evito di usare l'enumerazione perché potrebbe essere lineare mentre usando il membro: il metodo sarebbe molto più veloce. Questo è uno dei motivi per preferire l'uso di NSSet anziché di NSArray.
NSArray *myArray = [myNSSet allObjects];
MyObject *object = [myArray objectAtIndex:(NSUInteger *)]
sostituire NSUInteger con l'indice del vostro oggetto desiderato.
Dovrebbe essere: MyObject * object = [oggetto myArrayAtIndex: (NSUInteger *)] –
è possibile utilizzare filteredSetUsingPredicate se si dispone di un tipo di identificatore univoco per selezionare l'oggetto desiderato.
Innanzitutto creare il predicato (supponendo che il ID unico nell'oggetto si chiama "identificativo" ed è un NSString):
NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"identifier == %@", identifier];
e scegliere l'oggetto che utilizza il predicato:
NSObject *myChosenObject = [mySet filteredSetUsingPredicate:myPredicate].anyObject;
for (id currentElement in mySet)
{
// ** some actions with currentElement
}
Per Swift3 & iOS10:
//your current set
let mySet : NSSet
//targetted index
let index : Int
//get object in set at index
let object = mySet.allObjects[index]
- 1. Come si recupera un oggetto casuale da un'istanza NSSet?
- 2. Come posso ottenere un oggetto HDC da un oggetto CDC?
- 3. Come ottenere un oggetto da HttpResponseMessage?
- 4. Come ottenere un oggetto file da mkstemp()?
- 5. Come ottenere un oggetto Date da String
- 6. Come ottenere System.IO.Stream da un oggetto String
- 7. Creazione di un NSSet da NSArray in base alla proprietà
- 8. Come ottenere un oggetto delegato da un EventInfo?
- 9. Ottenere un oggetto da observableArray tramite indice
- 10. Aggiunta di un oggetto a un NSSet in un Core Data con relazioni many-to-many
- 11. Ottenere dinamicamente un valore da un oggetto dinamico
- 12. Ottenere un elemento concreto da un oggetto osservabile
- 13. Posso ottenere un oggetto da un PriorityQueue senza rimuoverlo?
- 14. Posso ottenere un oggetto jQuery da un elemento esistente
- 15. Come ottenere anno/mese/giorno da un oggetto data?
- 16. Come ottenere una data da un oggetto JSON
- 17. Come ottenere l'ID di un nuovo oggetto da una mutazione?
- 18. Come ottenere elementi html da un tag oggetto?
- 19. Come posso ottenere un oggetto caso Scala da Java?
- 20. Ottenere un singolo valore da un oggetto JSON utilizzando JSONPath
- 21. Ottenere un oggetto immagine da un array di byte
- 22. NSSet come estrarre l'oggetto casualmente?
- 23. Come ottenere un oggetto JQuery vuoto
- 24. Come posso ottenere un valore da un oggetto specifico da una mappa js immutabile?
- 25. Impostare un oggetto data Java da un oggetto DateTime Notes
- 26. Come posso ottenere un ITextBuffer da EnvDTE.Window?
- 27. Ottenere data o ora solo da un oggetto DateTime
- 28. Perché NSOrderedSet non eredita da NSSet?
- 29. kerberos da Java - ottenere un oggetto per l'utente attualmente autenticato
- 30. Come ottenere un flusso da un float []
Puoi anche cercare un oggetto conosciuto da un potenziale duplicato inviando al set un messaggio 'membro:'. Se restituisce 'nil', il set non contiene un oggetto uguale a quello che hai passato; se restituisce un puntatore all'oggetto, il puntatore restituito si trova già nell'oggetto nel set. Gli oggetti nel set devono implementare 'hash' e' isEqual: 'perché questo sia utile. –
@PeterHosey Non penso che 'hash' _needs_ sia implementato; sarebbe molto più veloce se lo facessi. – fumoboy007
@ fumoboy007: per l'archiviazione in un set o l'utilizzo come chiave in un dizionario, sì lo fa. Dalla documentazione di 'hash' nel protocollo NSObject:" Se due oggetti sono uguali (come determinato dal metodo 'isEqual:'), devono avere lo stesso valore di hash. "Attualmente, le implementazioni di NSObject di' hash' e 'isEqual : 'usa l'identità dell'oggetto (indirizzo). Se si esegue l'override di 'isEqual:', si sta impostando la possibilità di oggetti che non sono identici ma uguali, il quale, se non si esegue l'override di 'hash', avrà comunque hash diversi. Ciò viola il requisito che gli oggetti uguali abbiano uguali hash. –