2016-07-14 12 views
6

Ich versuche, entlang eines Wörterbuchs zu iterieren, um unbestätigte Einträge zu beschneiden. Der Swift 3 Übersetzung des folgenden Objective-C-Code funktioniert nicht:Iterieren entlang eines Wörterbuchs 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; 
       }]; 

Und so habe ich versucht, die folgende kompakt mit aufgezählt() -Methode auf diese Weise:

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 
      } 
     } 

Doch der Compiler meldet die folgende Fehler, während die Verwendung von Variable 'Elemente' Verarbeitung:

Wert des Tupels type '(keys: Int, Wert: SharingElement)' hat kein Mitglied 'bestätigt'

Wie "Element" nahm den vollen Tupel Vater als der Teil seiner Kompetenz. Ist das Problem bei der Verwendung von Aufzählungs() oder bei der Verarbeitung des Wörterbuchs und wie kann ich es beheben?

Antwort

-3

ich am Ende der Umsetzung die Sache wie:

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 
       } 
      } 
     } 

Also hoffentlich das Objekt zu löschen, ohne das Wörterbuch zu ändern, während es durchsucht wird, was verwendet, um die App zum Absturz zu bringen, auch wenn ich weiß nicht, ob es noch der Fall.

22

Verwenden Sie element.value.confirmed. element ist ein Tupel, das sowohl key und value enthält.

Aber Sie wollen wahrscheinlich nur enumerated() entfernen:

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

enumerated() nimmt die Iteration und fügt Indizes beginnend mit Null. Das ist nicht sehr üblich mit Wörterbüchern zu verwenden.

0

Dies sollte den Trick tun,

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

    })