#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
}