TL; DR: Используйте Карфаген включитьhttps://github.com/eggheadgames/SwiftTryCatchили CocoaPods включитьhttps://github.com/ravero/SwiftTryCatch.
Затем вы можете использовать код, подобный этому, не опасаясь, что приведет к сбою приложения:
import Foundation
import SwiftTryCatch
class SafeArchiver {
class func unarchiveObjectWithFile(filename: String) -> AnyObject? {
var data : AnyObject? = nil
if NSFileManager.defaultManager().fileExistsAtPath(filename) {
SwiftTryCatch.tryBlock({
data = NSKeyedUnarchiver.unarchiveObjectWithFile(filename)
}, catchBlock: { (error) in
Logger.logException("SafeArchiver.unarchiveObjectWithFile")
}, finallyBlock: {
})
}
return data
}
class func archiveRootObject(data: AnyObject, toFile : String) -> Bool {
var result: Bool = false
SwiftTryCatch.tryBlock({
result = NSKeyedArchiver.archiveRootObject(data, toFile: toFile)
}, catchBlock: { (error) in
Logger.logException("SafeArchiver.archiveRootObject")
}, finallyBlock: {
})
return result
}
}
Принятая ответ на @BPCorp работает, как задумано, но, как мы обнаружили, все становится немного интересно, если вы пытаетесь включите этот код Objective C в структуру Swift большинства и затем выполните тесты. У нас были проблемы с отсутствием функции класса (Ошибка: использование неразрешенного идентификатора). Поэтому, по этой причине, и просто общая простота использования, мы упаковали его как библиотеку Carthage для общего использования.
Как ни странно, мы могли бы использовать структуру Swift + ObjC в других местах без каких-либо проблем, это были только модульные тесты для фреймворка, который боролся.
Запрошенные PR-запросы! (Было бы неплохо иметь его сборку CocoaPod & Carthage, а также некоторые тесты).
К сожалению, вы не можете перехватывать исключения Objective-C в Swift, см., Например, http://stackoverflow.com/questions/24023112/try-catch-exceptions-in-swift. Можно считать ошибкой, что NSTask выдает исключения вместо того, чтобы возвращать ошибки, и вы можете подать отчет об ошибке, но я сомневаюсь, что Apple изменит API. –
Спасибо @MartinR. Я думаю, что это либо ошибка в API, либо Swift должен обеспечить механизм для исключения исключений ObjC (или лучше того и другого) ... В любом случае, я открыл ошибку (https://openradar.appspot.com/22837476) , хотя, я думаю, существует еще много методов API с той же проблемой. – silyevsk
Примером для меня был «NSPredicate (fromMetadataQueryString:)». Предполагается, что это 'init?', Поэтому, если строка плохая, она, вероятно, предназначена для возврата 'nil', но на самом деле это просто сбой с NSException. – matt