2015-12-12 9 views
5

Gibt es eine Möglichkeit (mithilfe eines Compiler-Flags oder eines Skripts), Zwangswicklungen in einem Swift-Projekt zu erkennen?Gibt es eine Möglichkeit, erzwungenes Auspacken in einem Swift-Projekt zu erkennen?

Ich denke über Dinge wie diese:

let b = a as! B 
let c = a! 
a!.method() 

Ohne Auslösung falsch-positive Ergebnisse für var a: A! zum Beispiel.

+0

Sie können die Suche "[^ \ 1]! [\ S \ p {P}]" regextern, um solche Instanzen einschließlich implizit ausgepackter Optionale zu finden (sie sind normalerweise so schlecht wie erzwungenes Auspacken), mit Ausnahme des Präfix '! für Bools und ähnliches. Ich habe dies [hier] (https://www.reddit.com/r/swift/comments/3a3k65/quick_tip_for_every_swift_programmer/) vorher gepostet, lassen Sie mich wissen, ob dies Ihre Frage beantwortet, und ich werde dies als Antwort posten – Kametrixom

+0

Verwenden Sie die Kraft Unwrap-Operator, der force-cast-Operator ('as!') oder die Ignore error-Anweisung ('try!') ist keine bedingungslose, universell schlechte Sache. Ebenso die Verwendung des 'ImplicitlyUnwrappedOptional ' -Typs - all dies sind Konstrukte, die sicher verwendet werden können, mit sorgfältiger Überlegung oder unbedacht auf eine Weise verwendet werden, die Fehler verursachen kann. Ich würde einräumen, dass die ersten drei eher ein Zeichen für eine leichtsinnige Codierung sind als die Verwendung des IUO-Typs, insbesondere, wenn man bedenkt, dass IUOs für Anwendungsfälle wie IB-Outlets notwendig (und empfohlen) sind. – rickster

Antwort

1

Wie in den Kommentaren erwähnt, kann eine Regex-Suche erstellt werden, um die meisten Verwendungen von Postfix ! zu fangen. (Und wenn Sie vorsichtig sind, sollten Sie in der Lage sein, die meisten Verwendungen von Doppelpunkttypenname-bang zu ignorieren, damit Sie kein Rauschen von IUO-Typdeklarationen erhalten.)

Dies ist ungefähr so ​​gut wie es geht, Es ist jedoch unvollständig. Wenn Sie beispielsweise eine API aufrufen, die einen IUO-Typ zurückgibt und auf ihr Ergebnis zugreift, ohne das Optionale zu prüfen, könnten Sie einen Force-Unwrap ausführen, ohne dass Ihr Code explizit geknallt wird.

Jedes Werkzeug, das versucht, unkontrolliert über unwraps zu warnen, müsste ein ziemlich tiefes Wissen über Swifts Typsystem, Grammatik und Typinferenzregeln haben. Und wirklich der einzige Ort, wo Sie solche Kenntnisse haben können (und es richtig haben), ist innerhalb des Compilers. Sie sind wahrscheinlich am besten von filing a feature request to Apple oder arbeiten mit der open source project.