2016-07-14 142 views
6

Sto provando ad iterare lungo un dizionario per potare le voci non confermate. La traduzione Swift 3 del seguente codice Objective-C non funziona:Iterating along a Dictionary in Swift 3

[[self sharingDictionary] enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) { 
        SharingElement* element=[[self sharingDictionary] objectForKey:key]; 
        if (!element.confirmed){ 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          [element deleteMe]; 
         }); 
         [[self sharingDictionary] performSelector:@selector(removeObjectForKey:) withObject:key 
                 afterDelay:.2]; 
        } else{ 
         element.confirmed=NO; 
       }]; 

E così ho provato ad utilizzare il seguente compatto enumerato() il metodo in questo modo:

for (key, element) in self.sharingDictionary.enumerated(){ 
      if (!element.confirmed){ 
        element.deleteMe() 
       self.perform(#selector(self.removeSharingInArray(key:)), with:key, afterDelay:0.2); 
      } else{ 
       element.confirmed=false 
      } 
     } 

Eppure il compilatore segnala la seguente errore durante l'utilizzo del 'elemento' variabile:

valore di tipo tupla '(Rif: Int, valore: SharingElement)' ha nessun membro 'confermato'

Come "elemento" ha preso il padre di tuple completo rispetto alla parte della sua competenza. Il problema è nell'uso di enumerated() o nell'elaborazione del dizionario e come posso risolverlo?

risposta

-3

ho finito per attuare la cosa come:

DispatchQueue.global(attributes: .qosBackground).async{ 
      for (key, element) in self.sharingDictionary{ 
       if !element.confirmed{ 
        DispatchQueue.main.async({ 
         element.deleteMe() 
         self.removeSharingInArray(key:key) 
        }) 
       } else{ 
        element.confirmed=false 
       } 
      } 
     } 

Così si spera di eliminare l'oggetto senza cambiare il dizionario mentre si esplora, quello utilizzato per mandare in crash l'applicazione, anche se non so se ancora il caso.

22

Utilizzare element.value.confirmed. element è una tupla che contiene sia key e value.

Ma probabilmente vuole solo rimuovere enumerated():

for (key, element) in self.sharingDictionary { 
    ... 
} 

enumerated() prende l'iterazione e aggiunge indici partendo da zero. Non è molto comune da usare con i dizionari.

0

Questo dovrebbe fare il trucco,

 localDictionary.enumerateKeysAndObjects ({ (key, value, stop) -> Void in 

    })