2016-04-04 6 views
0

Die Schleife dekrementiert den Schleifenzähler, wenn sie ein Element findet, das nicht vorhanden sein sollte, und entfernt es.So schreiben Sie eine Swift 3-Schleife ohne einen änderbaren Zähler

 var iMax = numListViews 
     for var i = 0; i < numListViews; i += 1 { 
      if (columnsSortTypesArray[i] == "") { 
       columnsSortTypesArray.removeAtIndex(i) 
       i-- 
       iMax-- 
      } else { 
       listViews[i].sortList(columnsSortTypesArray[i]) 
      } 
     } 
+3

Was ist 'listViews'? Und 'columnsSortTypesArray', ist es ein' String' Array? Was ist die '.sortList' Methode, die auf' i' angewendet wird: Die Übertragung von 'listView'? Bitte werfen Sie einen Blick auf [So erstellen Sie ein minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) und aktualisieren Sie möglicherweise Ihre Fragen mit relevanteren (jedoch nicht aufgeblähten) Informationen. – dfri

+4

Ihr ursprünglicher Code ist bereits ein wenig verschleiert. Schau dir die 'filter()' Methode an! –

+1

Auch ein Kommentar zum obigen Code: Was ist, wenn 'columnsSortTypesArray' eine Länge (num. Elements) hat, die nur geringfügig größer als' numListViews' ist, aber mehrere '" "Einträge enthält? Dies könnte zu einer Laufzeitausnahme beim 'columnsSortTypesArray [i]' (versuchten) Elementzugriff führen, da 'i' nach mehreren nachfolgenden Elemententfernungen von 'columnsSortTypesArray' zunimmt (nach der die Länge von 'columnsSortTypesArray' möglicherweise ' dfri

Antwort

-1

Sie können ersetzen jede C-Stil-Array mit einer while Schleife wie folgt aus:

var i = 0 
while i < numListViews { 
    // the rest of your code here 
    i += 1 
} 

Ich weiß nicht, ob dies ist, was Sie suchen, aber wenn Sie genauer sein über Ihre Typen und warum Sie den veränderbaren Zähler entfernen möchten, werde ich versuchen zu helfen.

+1

Technisch korrekt, aber würde niemals einen Code-Review bestehen. – nhgrif

+0

Es gibt einige gute Gründe, dies über eine for-Schleife zu tun. In diesem Fall ändert der Autor die Schleifenvariable und eine While-Schleife ist in Swift praktisch die einzige Möglichkeit. Natürlich ist das Ändern der Schleifenvariable innerhalb der Schleife ein schlechtes Zeichen für sich selbst ... – ColGraff

+0

Genau deshalb würde dies niemals einen Code-Review passieren. In diesem speziellen Fall, was wirklich passieren muss, ist ein 'Filter'-Aufruf, aber ich kann mir keinen Fall vorstellen, bei dem das Ändern der Schleifenvariablen tatsächlich notwendig ist. Also muss ich meinen Downvote anwenden. Wenn Sie dies bearbeiten können, um ein überzeugendes Beispiel dafür zu enthalten, wo ich * wirklich * die Loop-Variable ändern möchte, würde ich in Erwägung ziehen, den Downvote zu entfernen. – nhgrif

6

Sie hätten zu diesem Zweck überhaupt keine for-Schleife verwenden sollen. Das Ändern der Schleifenvariablen innerhalb der Schleife ist fehleranfällig und ein gutes Beispiel, warum C-style for-Schleifen veraltet sind.

Um leere Strings aus einer Array Verwendung filter() zu entfernen:

columnsSortTypesArray = columnsSortTypesArray.filter { $0 != "" } 

einen anderen Array bevöl basierend auf diesem Array verwendet map(), z.B.

listViews = columnsSortTypesArray.map { sortList($0) } 

auch: Wenn zwei (oder mehr) Arrays, die immer synchron gehalten werden müssen, halten ein struct WhatEver mit zwei (oder mehr) Eigenschaften und ein einziges Array dieser WhatEver Elemente verwenden definieren stattdessen.

Verwandte Themen