Прежде всего, я новичок в iOS и Swift и прихожу на фоне программирования Android/Java. Поэтому для меня идея поймать исключение из попытки записать в файл является второй натурой, в случае нехватки места, проблем с правами доступа к файлам или что-то еще, что может случиться с файлом (и это случилось, по моему опыту) , Я также понимаю, что в Swift исключения отличаются от Android/Java, поэтому я не об этом спрашиваю.Как правильно обрабатывать исключения NSFileHandle в Swift 2.0?
Я пытаюсь добавить в файл с помощью NSFileHandle, например, так:
let fileHandle: NSFileHandle? = NSFileHandle(forUpdatingAtPath: filename)
if fileHandle == nil {
//print message showing failure
} else {
let fileString = "print me to file"
let data = fileString.dataUsingEncoding(NSUTF8StringEncoding)
fileHandle?.seekToEndOfFile()
fileHandle?.writeData(data!)
}
Однако, как seekToEndOfFile()
и writeData()
функции показывают, что они бросают своего рода исключение:
Этот метод вызывает исключение, если дескриптор файла закрыт или недействителен, если приемник представляет собой не связанную трубку или конечную точку сокета, если в файловой системе не остается свободного места или возникает какая-либо другая ошибка записи. - Документация для Apple для
writeData()
Итак, что же это за правильный способ справиться с Swift 2.0? Я прочитал ссылки Error-Handling in Swift-Language, try-catch exceptions in Swift, NSFileHandle writeData: exception handling, Swift 2.0 exception handling и How to catch an exception in Swift, но ни один из них не имеет прямого ответа на мой вопрос. Я прочитал что-то об использовании объектного C в коде Swift, но так как я новичок в iOS, я не знаю, что этот метод, и не может найти его где-нибудь. Я также попробовал новые блоки Swift 2.0 do-catch
, но они не признают, что для методов NSFileHandle генерируется ошибка любого типа, скорее всего, поскольку в документации по функциям нет ключевого слова throw.
Я знаю, что я мог бы просто разрешить приложение сбой, если у него закончится свободное пространство или что-то еще, но так как приложение позже будет выпущено в магазин приложений позже, я не хочу этого. Итак, как мне это сделать Swift 2.0?
EDIT: В настоящее время это проект с только кодом Swift, поэтому, хотя кажется, что есть способ сделать это в Objective-C, я понятия не имею, как смешать эти два.
К сожалению, я не могу это скомпилировать. Xcode (версия 7.2) дает мне ошибку «Неизвестное имя типа» NS_ASSUME_NONNULL_BEGIN'' и, конечно же, то же самое для соответствующей декларации конца. Предположительно, это было исправлено в Xcode 6.4 из того, что я читаю, и поскольку я не использую какие-либо модули или что-то еще, я понятия не имею, почему у меня есть эта ошибка. Есть идеи? – mirage
Очень странно, я не видел эту проблему. попробуйте создать новый проект Swift и используйте там код. если это работает, найдите разницу между двумя файлами проекта. – Casey
обновленный код для остановки использования '' 'NS_ASSUME_NONNULL_BEGIN''' – Casey