不完全理想,但有一种选择是只写两个重载“一个带一个不抛出的闭包,它本身不抛出,另一个带一个抛出闭包,它自己抛出。
例如:
public func doInMain(_ block: (NSManagedObjectContext) -> Void) {
guard let context = mainQueueContext else { return }
context.performAndWait {
block(context)
}
}
public func doInMain(_ block: (NSManagedObjectContext) throws -> Void) throws {
guard let context = mainQueueContext else { return }
var thrownError: Error?
context.performAndWait {
do {
try block(context)
} catch {
thrownError = error
}
}
if let error = thrownError {
throw error
}
}
请记住,如果需要,可以始终根据抛出重载实现非抛出重载:
public func doInMain(_ block: (NSManagedObjectContext) -> Void) {
let fn = doInMain as ((NSManagedObjectContext) throws -> Void) throws -> Void
try! fn(block)
}
您应该能够使用两个重载,其方式与使用单个重新引发重载的方式大致相同。