У меня есть два типа файлов в папке ICloud в Docs:Как узнать, закодирован ли файл?
- Текстовые файлы
- закодированные с протоколом NSCoding
Оба типа использует расширение .txt. Как узнать, был ли файл закодирован?
Поскольку я не знаю, является ли файл текстовым файлом или кодированный файл, сначала я пытаюсь открыть любой файл, как если бы это были закодированы, в надежде, что любая ошибка будет пойман на обработчик завершения работы открытой в:
var doc = MyCloudDocumentType1(fileURL: url)
doc.openWithCompletionHandler { (success: Bool) -> Void in
if success {
println("Doc. opened")
}
}
когда UIDocument пытается загрузить содержимое файла, я получаю исключение при попытке разархивировать текстовый файл:
override func loadFromContents(contents: AnyObject!, ofType typeName: String!, error outError: NSErrorPointer) -> Bool {
if (contents as NSData).length == 0 {
return false
}
NSKeyedUnarchiver.unarchiveObjectWithData(contents as NSData)
return true
}
исключение обстреляно NSKeyedUnarchiver.unarchiveObjectWithData(contents as NSData)
, указывая, что есть недопустимый аргумент :
'NSInvalidArgumentException', reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive
Это исключение имеет смысл, поскольку я пытаюсь декодировать текстовый файл (файл, который не закодирован). Проблема в том, что я не могу поймать исключение в swift, и к тому времени, когда я знаю, что файл не является закодированным, слишком поздно что-то делать.
Как узнать, был ли закодирован файл? Каков наилучший способ определить, закодирован ли файл и, таким образом, кодируется?
Спасибо!
******РЕШЕНИЕ******
На основе замечаний @AlainCollins, я прочитал первые 4 байта закодированного файла, как это будет моя магия номер:
var magicNumber = [UInt](count: 4, repeatedValue: 0)
data.getBytes(&magicNumber, length: 4 * sizeof(UInt))
Затем я сравнил первые 4 байта каждого файла в папке Docs с этим магическим числом.
Относительно того, почему нет быстрых попыток, здесь [ссылка] (http://stackoverflow.com/questions/24023112/try-catch-exceptions-in-swift) –