Swift утверждает в любом случае для печати переменных в строке

#swift #assert

#быстрый #утверждать

Вопрос:

Предыстория: В Objective-C я бы создал свое утверждение с включенной отладочной информацией:

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

Однако глобальная assert функция в Swift, похоже, не допускает этого, поскольку параметром сообщения является StaticString . Так что я НЕ могу этого сделать:

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

Вопрос: Есть ли альтернативная assert функция, которая не требует статической строки, или я должен продолжать использовать NSAssert , если я хочу добавить дополнительную информацию, чтобы упростить отладку?

Комментарии:

1. Что произойдет, если вы замените часть «Ожидаемый ……» на строковые объекты? Извините, в Windows не удается протестировать.

2. @LordZsolt Если я напишу let assertString = "Expect: sectionIndex > 0; Actual (sectionIndex)"; assert(sectionIndex > 0, assertString) , я получу эту ошибку: «Не удалось найти перегрузку для ‘assert’, которая принимает предоставленные аргументы»

3. Я не знаю, когда Apple изменила это, но теперь assert может обрабатывать интерполяцию строк.

Ответ №1:

Я не думаю, что в настоящее время вы можете это сделать из-за параметра StaticString. Я попытался установить строку сообщения с помощью параметра let, но, похоже, вы даже не можете поместить туда переменную. Это должна быть статическая строка в кавычках.

Как бы то ни было, пример кода Apple следует тому же шаблону:

 assert(listItems amp;amp; listItems!.count == 1, "There must be exactly one moved item.")
 

Комментарии:

1. Спасибо за ответ.

Ответ №2:

Вы можете написать свою собственную версию assert с помощью String . Вот пример:

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

или с дополнительной отладочной информацией:

 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
}