as?
won't always give you the expected result because as
doesn't test if a data type is of a specific kind but only if a data type can be converted to or represented as specific kind.
Consider this code for example:
func handleError ( error: Error ) {
if let nsError = error as? NSError {
Every data type conforming to the Error
protocol can be converted to a NSError
object, so this will always succeed. Yet that doesn't mean that error
is in fact a NSError
object or a subclass of it.
A correct type check would be:
func handleError ( error: Error ) {
if type(of: error) == NSError.self {
However, this checks for the exact type only. If you want to also include subclass of NSError
, you should use:
func handleError ( error: Error ) {
if error is NSError.Type {