Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the difference between "as?", "as!", and "as"?

Tags:

casting

swift

Before I upgraded to Swift 1.2, I could write the following line:

if let width = imageDetails["width"] as Int? 

Now it forces me to write this line:

if let width = imageDetails["width"] as! Int? 

My question is, if I'm forced to write it as above, couldn't I just write the code below and it would do the same thing? Would it give me the same result in all values of imageDetails?

if let width = imageDetails["width"] as Int 
like image 738
Alex Avatar asked Apr 14 '15 21:04

Alex


People also ask

Where do we use as as?

We use as + adjective/adverb + as to make comparisons when the things we are comparing are equal in some way: The world's biggest bull is as big as a small elephant. The weather this summer is as bad as last year. It hasn't stopped raining for weeks.

What is mean by as as as?

Also, so . . . as. Used with an adjective or adverb to show similarity or equality of one thing with another. The as . . . as construction appears in numerous similes, including the idioms as rich as Croesus, as big as life, as good as done.

What is the use of as As and give examples?

Your car is as expensive as ours. Take your race horse is as fast as my race horse. Your computer is as new as my computer. Your crayons are as good as my crayons.

What is difference between so as and as as?

Use as . . . as to compare two items either in a positive or a negative statement. Use so . . . as only for negative comparisons.


2 Answers

The as keyword used to do both upcasts and downcasts:

// Before Swift 1.2 var aView: UIView = someView()  var object = aView as NSObject // upcast   var specificView = aView as UITableView // downcast 

The upcast, going from a derived class to a base class, can be checked at compile time and will never fail.

However, downcasts can fail since you can’t always be sure about the specific class. If you have a UIView, it’s possible it’s a UITableView or maybe a UIButton. If your downcast goes to the correct type – great! But if you happen to specify the wrong type, you’ll get a runtime error and the app will crash.

In Swift 1.2, downcasts must be either optional with as? or “forced failable” with as!. If you’re sure about the type, then you can force the cast with as! similar to how you would use an implicitly-unwrapped optional:

// After Swift 1.2 var aView: UIView = someView()  var tableView = aView as! UITableView 

The exclamation point makes it absolutely clear that you know what you’re doing and that there’s a chance things will go terribly wrong if you’ve accidentally mixed up your types!

As always, as? with optional binding is the safest way to go:

// This isn't new to Swift 1.2, but is still the safest way var aView: UIView = someView()  if let tableView = aView as? UITableView {   // do something with tableView } 

Got this from a site: SOURCE

like image 57
Eendje Avatar answered Sep 16 '22 11:09

Eendje


as

In Swift 1.2 and later, as can only be used for upcasting (or disambiguation) and pattern matching:

// 'as' for disambiguation let width = 42 as CGFloat let block = { x in x+1 } as Double -> Double let something = 3 as Any?  // optional wrapper can also be added with 'as' 


// 'as' for pattern matching switch item { case let obj as MyObject:     // this code will be executed if item is of type MyObject case let other as SomethingElse:     // this code will be executed if item is of type SomethingElse ... } 

as?

The conditional cast operator as? tries to perform a conversion, but returns nil if it can't. Thus its result is optional.

let button = someView as? UIButton  // button's type is 'UIButton?'  if let label = (superview as? MyView)?.titleLabel {     // ... } 

as!

The as! operator is for forced type conversion.

Use the forced form of the type cast operator (as!) only when you are sure that the downcast will always succeed. This form of the operator will trigger a runtime error if you try to downcast to an incorrect class type.

// 'as!' for forced conversion. // NOT RECOMMENDED. let buttons = subviews as! [UIButton]  // will crash if not all subviews are UIButton let label = subviews.first as! UILabel 
like image 31
jtbandes Avatar answered Sep 19 '22 11:09

jtbandes