Ich sehe mir Xcode 7.3-Notizen an und stelle dieses Problem fest.
Die Operatoren ++ und - sind veraltet
Könnte jemand erklären, warum es veraltet ist? Und bin ich richtig , dass in der neuen Version von Xcode jetzt Sie statt verwenden ++
diese x += 1
;
Beispiel:
for var index = 0; index < 3; index += 1 {
print("index is \(index)")
}
++
und--
-Operatoren verwenden müssenAntworten:
Eine vollständige Erklärung hier von Chris Lattner, Swifts Schöpfer. Ich werde die Punkte zusammenfassen:
x += 1
for i = 0; i < n; i++ { ... }
die Swift bessere Alternativen hat, wiefor i in 0..<n { ... }
(C-Stil für Schleife geht ebenfalls aus )x - ++x
oderfoo(++x, x++)
?Für Interessierte (und um Link Rot zu vermeiden) sind Lattners Gründe in seinen eigenen Worten:
quelle
++
nicht in Sprachen im C-Stil existiert, würde niemand, der bei klarem Verstand ist, das Design von Swift 3.0 betrachten und denken, dass ein++
Operator eine nette Ergänzung dazu wäre.Mir ist klar, dass dieser Kommentar die Frage nicht beantwortet, dennoch gibt es möglicherweise Leute, die nach einer Lösung suchen, um diese Operatoren am Laufen zu halten, und eine solche Lösung finden Sie unten. 😇
Ich persönlich bevorzuge
++
und--
Betreiber. Ich kann der Meinung nicht zustimmen, dass sie schwierig oder schwer zu handhaben sind. Sobald der Entwickler versteht, was diese Operatoren tun (und wir sprechen von ziemlich einfachen Dingen), sollte der Code sehr klar sein.In der Erklärung, warum die Operatoren veraltet waren, wird erwähnt, dass ihre Hauptverwendung im C-Stil für Schleifen war. Ich weiß nichts über andere, aber ich persönlich verwende überhaupt keine C-Schleifen und es gibt noch viele andere Orte oder Situationen, in denen
++
oder--
Operator nützlich ist.Ich möchte auch erwähnen, dass
varName++
ein Wert zurückgegeben wird, damit er in derreturn
wohingegenvarName += 1
nicht verwendet werden kann.Für jeden von Ihnen, der diese Operatoren hier weiterarbeiten lassen möchte, ist die Lösung:
quelle
return (x - 1)
für die Postfix-Operatoren nicht - IMHO ist es sauberer, die Semantik beizubehalten, dass sie (eine Kopie) des ursprünglichen Werts zurückgeben, anstatt das, was Sie erhalten, wenn Sie dies tunx + 1 - 1
Int
das Ergebnis von(x + 1)
überflogen, was die Ausführung unterbricht und daherresult - 1
nicht einmal ausgeführt wird. Andere Datentypen wieDouble
zum Beispiel verhalten sich jedoch anders, daher muss ich das untersuchen.defer
dies auch verwenden.defer { x += 1 }; return x
Apple hat das entfernt
++
und es mit dem anderen alten traditionellen Weg viel einfacher gemacht.Stattdessen
++
müssen Sie schreiben+=
.Beispiel:
In ähnlicher Weise müssen Sie für den Dekrementierungsoperator
--
schreiben-=
Beispiel:
Für
for
Schleifen:Inkrement Beispiel:
Anstatt
Du kannst schreiben:
Beispiel für Dekrementierung:
Du kannst schreiben:
Hoffe das hilft!
quelle
+=
war die ganze Zeit dort.++i
und--i
?Chris Lattner ist gegen ++ und - in den Krieg gezogen. Er schreibt: „Code, der tatsächlich den Ergebniswert dieser Operatoren verwendet, ist für einen Leser / Verwalter von Code oft verwirrend und subtil. Sie fördern „übermäßig kniffligen“ Code, der zwar niedlich, aber schwer zu verstehen ist. Obwohl Swift eine genau definierte Reihenfolge für die Auswertung hat, wäre jeder Code, der davon abhängt (wie foo (++ a, a ++)), unerwünscht, selbst wenn dies der Fall wäre war gut definiert ... diese scheitern an der Metrik "Wenn wir diese nicht schon hätten, würden wir sie zu Swift 3 hinzufügen?"
Apple wollte schnell eine saubere, klare, nicht verwirrende und auf den Punkt gebrachte Sprache beibehalten. Und so veralteten sie ++ und - Schlüsselwort.
quelle
...for i in 0.stride(to: 10, by: 2)...
oder...for i in (1...10).reverse()...
ist sauber?!Das
Fix-it feature
von Xcode gibt eine klare Antwort darauf.Ersetzen Sie
++ increment operator
durch altmodischvalue += 1
(Kurzhandbediener) und-- decrement operator
durchvalue -= 1
quelle
Für Swift 4 können Sie die Operatoren
++
und--
als Erweiterungen fürInt
und andere Typen wiederherstellen . Hier ist ein Beispiel:Es funktioniert auf die gleiche Art und Weise für andere Arten, wie
UIInt
,Int8
,Float
,Double
, usw.Sie können diese Erweiterungen in eine einzelne Datei in Ihrem Stammverzeichnis einfügen, und sie können dort in allen anderen Dateien verwendet werden.
Ich habe ein paar Abstimmungen für meine Antwort hier bemerkt, fast sobald ich sie gepostet habe. Was ich eher als philosophische Meinungsverschiedenheit als als Kritik an der Funktionsweise meines Codes betrachte. Es funktioniert perfekt, wenn Sie es auf einem Spielplatz auschecken.
Der Grund, warum ich diese Antwort gepostet habe, ist, dass ich nicht damit einverstanden bin, Computerprogrammiersprachen unnötig voneinander zu unterscheiden.
Viele Ähnlichkeiten zwischen Sprachen erleichtern es den Menschen, zu lernen und von einer Sprache in eine andere zu wechseln.
Entwickler verwenden normalerweise mehrere Programmiersprachen und nicht nur eine. Und es ist ein echtes Problem, von einer Sprache in eine andere zu wechseln, wenn es keine Konventionen und keine gemeinsame Standardisierung zwischen den Sprachen gibt.
Ich glaube, dass es nur so viele Syntaxunterschiede zwischen den Sprachen geben sollte, wie nötig, und nicht mehr.
quelle
Hier ist eine generische Version eines Teils des bisher veröffentlichten Codes. Ich würde die gleichen Bedenken wie andere Stimme: es eine bewährte Methode ist es , nicht diese in Swift zu verwenden. Ich bin damit einverstanden, dass dies für diejenigen, die Ihren Code in Zukunft lesen, verwirrend sein könnte.
Dies kann auch als Erweiterung des numerischen Typs geschrieben werden.
quelle
@discardableResult
zu jeder dieser Funktionen hinzugefügt , um die Warnung zu unterdrücken, dass der Rückgabewert nicht verwendet wird. sonst genau das, wonach ich gesucht habe.Aus den Dokumenten :
quelle
Das ist definitiv ein Nachteil, oder?
quelle
Da Sie in Swift nie wirklich mit Zeigern arbeiten, ist es meiner Meinung nach sinnvoll, die Operatoren
++
und zu entfernen--
. Wenn Sie jedoch nicht ohne leben können, können Sie Ihrem Projekt die folgenden Operatordeklarationen für Swift 5+ hinzufügen :quelle
In Swift 4.1 konnte dies folgendermaßen erreicht werden:
Beachten Sie, dass diese Lösung trotz der Tatsache, dass sie den vorherigen Lösungen in diesem Beitrag ähnelt, in Swift 4.1 nicht mehr funktioniert und in diesem Beispiel. Beachten Sie auch, dass jeder, der oben erwähnt, dass + = ein Ersatz für ++ ist, den Operator nicht vollständig versteht, da ++ in Kombination mit der Zuweisung tatsächlich zwei Operationen sind, daher eine Verknüpfung. In meinem Beispiel:
var s = t++
macht zwei Dinge: Weisen Sie s den Wert von t zu und erhöhen Sie dann t. Wenn das ++ vorher kommt, sind es die gleichen zwei Operationen, die in umgekehrter Reihenfolge ausgeführt werden. Meiner Meinung nach ist die Argumentation von Apple, warum dieser Operator entfernt werden soll (in früheren Antworten erwähnt), nicht nur eine falsche Argumentation, sondern ich halte es auch für eine Lüge, und der wahre Grund ist, dass sie ihren Compiler nicht dazu bringen konnten, damit umzugehen. Es gab ihnen Probleme in früheren Versionen, also gaben sie auf. Die Logik "zu kompliziert, um den Operator zu verstehen, daher entfernt" ist offensichtlich eine Lüge, da Swift Operatoren enthält, die weitaus komplizierter und viel weniger nützlich sind und nicht entfernt wurden. Auch die überwiegende Mehrheit der Programmiersprachen hat es. JavaScript, C, C #, Java, C ++ und viele mehr. Programmierer nutzen es gerne. Für wen es zu schwierig ist, diesen Operator zu verstehen,Die Strategie hinter Swift ist einfach: Apple hält den Programmierer für dumm und sollte daher entsprechend behandelt werden.
Die Wahrheit ist, dass Swift, das im September 2014 gestartet wurde, inzwischen woanders sein sollte. Andere Sprachen sind viel schneller aufgewachsen.
Ich kann viele wichtige Fehler in der Sprache auflisten, von schwerwiegenden: wie nach Wert und nicht nach Referenz eingefügte Arrays bis hin zu nervigen: Variadische Parameterfunktionen können kein Array akzeptieren, was die ganze Idee dahinter ist. Ich glaube nicht, dass Apples Mitarbeiter sich andere Sprachen wie Java ansehen dürfen, damit sie nicht einmal wissen, dass Apple Lichtjahre zurückliegt. Apple hätte Java als Sprache übernehmen können, aber heutzutage ist Herausforderung keine Technologie, sondern Ego. Wenn sie IntelliJ geöffnet hätten, um Java zu schreiben, würden sie mit Sicherheit ihr Geschäftsverständnis schließen, dass sie zu diesem Zeitpunkt niemals aufholen können und werden.
quelle