2014-06-25 14 views
9

Tło: w Objective-C, chciałbym utworzyć mój twierdzenie z informacji debugowania włączone:Swift assert mimo to wydrukować zmienne łańcucha

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

Jednak globalny assert funkcja w Swift nie wydaje aby na to zezwolić, ponieważ parametrem wiadomości jest StaticString. Więc nie mogę tego zrobić:

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

Pytanie: Czy istnieje alternatywa assert funkcja, która nie wymaga statycznego ciąg, czy mam kontynuować korzystanie NSAssert jeśli chcę umieścić w informacji dodatkowej do debugowania łatwiejsze ?

+0

Co się dzieje, jeśli zastąpić „Oczekiwane ......” część z obiektów ciąg? Niestety, w systemie Windows nie można przetestować. –

+0

@LordZsolt Jeśli napiszę 'let assertString =" Expect: sectionIndex> 0; Actual \ (sectionIndex) "; assert (sectionIndex> 0, assertString) 'Otrzymuję ten błąd:" Nie można znaleźć przeciążenia dla 'assert', które akceptuje dostarczone argumenty " – Tobias

+0

Nie wiem, kiedy jabłko to zmieniło, ale asercja może teraz obsługiwać interpolację napisów. – Tobias

Odpowiedz

8

Nie sądzę, że można obecnie z powodu parametru staticString. Próbowałem ustawić ciąg znaków za pomocą let, ale nie można nawet umieścić zmiennej w tym miejscu. Musi to być StaticString w cytatach.

Na co warto, Apple sample code według takiego samego schematu:

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

Dzięki za odpowiedź. – Tobias

1

Możesz napisać własną wersję assert sznurkiem. Oto przykład:

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

lub z dodatkową informacją debug:

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 
}