2014-06-25 11 views
9

Hintergrund: In Objective-C, würde ich meine Behauptung erstellen mit Debug-Informationen enthalten:Swift assert ohnehin Variablen in Zeichenfolge drucken

NSAssert(poetCount > 5, "Expected poetCount > 5; Actual: %d", poetCount); 

jedoch die globale assert Funktion in Swift scheint nicht um dies zu ermöglichen, da der Nachrichtenparameter ein StaticString ist. So kann ich dies nicht tun:

assert(NSFileManager.defaultManager().fileExistsAtPath(fullpath), 
"Expected: File to Exist @ \(fullpath)") 

Frage: Gibt es eine Alternative assert Funktion, die keine statische Zeichenfolge erfordert, oder sollte ich weiterhin mit NSAssert wenn ich in zusätzliche Informationen setzen wollen erleichtern das Debuggen ?

+0

Was passiert, wenn Sie den "Erwartete ......" Teil mit einem String-Objekten ersetzen? Entschuldigung, unter Windows kann nicht getestet werden. –

+0

@LordZsolt Wenn ich schreibe 'let assertString =" Expect: sectionIndex> 0; Tatsächliche \ (sectionIndex) "; assert (sectionIndex> 0, assertString) 'Ich erhalte diesen Fehler:" Konnte keine Überladung für 'assert' finden, die die angegebenen Argumente akzeptiert " – Tobias

+0

Ich weiß nicht, wann Apple dies geändert hat, aber die Assert kann nun String-Interpolation verarbeiten. – Tobias

Antwort

8

Ich glaube nicht, dass Sie derzeit wegen der StaticString-Parameter können. Ich habe versucht, den Nachrichtenstring mit einem Let zu setzen, aber Sie können nicht einmal eine Variable dort hineinbringen, scheint es. Es muss ein StaticString in Anführungszeichen stehen.

Für das, was es wert ist, Apples sample code folgt dem gleichen Muster:

assert(listItems && listItems!.count == 1, "There must be exactly one moved item.") 
+0

Danke für die Antwort. – Tobias

1

Sie können Ihre eigene Version von assert mit String schreiben. Hier ist Beispiel:

func assert(condition: @autoclosure() -> Bool, _ message: String = "") { 
    #if DEBUG 
     if !condition() { 
      println(message); 
       abort() 
     } 
    #endif 
} 

oder mit zusätzlichen Debug-Informationen:

func assert(condition: @autoclosure() -> Bool, _ message: String = "", file: String = __FILE__, line: Int = __LINE__) { 
    #if DEBUG 
     if !condition() { 
      println("assertion failed at \(file):\(line): \(message)"); 
       abort() 
     } 
    #endif 
}