1

Why are there as vs. as! vs. as? type casting in Swift ?

Maxim Veksler
  • 29,272
  • 38
  • 131
  • 151
  • possible duplicate of [Downcasting optionals in Swift: as? Type, or as! Type?](http://stackoverflow.com/questions/25708649/downcasting-optionals-in-swift-as-type-or-as-type) or http://stackoverflow.com/q/29637974/2792531 or http://stackoverflow.com/q/29674986/2792531 – nhgrif Jul 03 '15 at 23:40
  • I can't agree, I've reviewed all the above questions before posting, to my preference none speaks of the 3 various operations in a concise clear and easy to understand way. I've made this question to be as clear as possible coupled with demo code for future seekers, and as such I wouldn't call it a duplicate. – Maxim Veksler Jul 04 '15 at 16:20

1 Answers1

6

as is compile time cast

as? and as! are runtime casts

  • as? will cast, if cast not possible will return Optional(nil)
  • as! will cast, if cast not possible will crash with runtime error

Example:

class Music { }
class Pop: Music { }
class Rock: Music { }

Pop() as Music // OK, some might disagree but Music *is* a super class of Pop
Pop() as Rock  // Compile error: 'Pop' is not convertable to 'Rock'

let pop: AnyObject = Pop()

pop as Music // Compile error: 'AnyObject' is not convertible to 'Music'

pop as? Pop // Pop
pop as! Pop // Pop
pop as? Music // Pop
pop as! Music // Pop

pop as? Rock // nil
pop as! Rock // Runtime error signal SIGABRT
Maxim Veksler
  • 29,272
  • 38
  • 131
  • 151