Understanding the “some” and “any” keywords in Swift 5.7 | by Lee Kah Seng

No extra confusion!

Image of confused man.

The some and any key phrases should not new in Swift. The some key phrase was launched in Swift 5.1 whereas the any key phrase was launched in Swift 5.6. In Swift 5.7, Apple makes one other nice enchancment on each of those key phrases. We are able to now use each of those key phrases within the perform’s parameter place!

This enchancment not solely made the generic capabilities look quite a bit cleaner, but additionally unlocked some thrilling new methods to write down generic code in Swift. Spoiler alert — we will now say goodbye to the next error message:

protocol can solely be used as a generic constraint as a result of it has Self or related kind necessities

Wish to know extra? Learn on!

Earlier than entering into the small print, let’s outline the protocol we will probably be utilizing all through this text.

After that, we are going to outline a Automotive and a Bus struct that conforms to the Carprotocol and every of them would require totally different sorts of fuels. Right here’s the code:

Discover that the fillGasTank(with:) perform’s parameter knowledge kind of Automotive and Bus should not the identical, Automotive requires Gasoline whereas Bus requires Diesel. That’s the reason we have to outline an related kind known as FuelType in our Carprotocol.

With that out of the way in which, let’s dive proper into the small print, we could?

The some key phrase was launched in Swift 5.1. It’s used along with a protocol to create an opaque kind that represents one thing that’s conformed to a particular protocol. When used within the perform’s parameter place, it signifies that the perform is accepting some concrete kind that conforms to a particular protocol.

At this stage, you may be questioning, aren’t we already in a position to try this?

Actually, you’re proper. Utilizing the some key phrase within the perform’s parameter place is precisely the identical as utilizing the angle brackets or a trailing the place clause on the perform signature.

After we use the some key phrase on a variable, we’re telling the compiler that we’re engaged on a particular concrete kind, thus the opaque kind’s underlying kind should be fastened for the scope of the variable.

One attention-grabbing level to pay attention to is that assigning a brand new occasion of the identical concrete kind to the variable can also be prohibited by the compiler.

With that in thoughts, we should comply with the identical rule when utilizing it with an array.

The identical goes for the underlying return kind of a perform.

That’s all for the some key phrase. Let’s head over to the any key phrase and see what are the variations between them.

The any key phrase was launched in Swift 5.6. It’s launched for the aim of making an existential kind. In Swift 5.6, the any key phrase will not be necessary when creating an existential kind, however in Swift 5.7, you’re going to get a compile error if you happen to failed to take action.

As defined by Apple engineers, an existential kind is sort of a field that comprises one thing that conforms to a particular protocol.

Compare the differences between the some and any keyword in Swift
Evaluating the some and any key phrase

As illustrated within the picture above, the principle distinction between an opaque kind and an existential kind is the “field.” The “field” permits us to retailer any concrete kind inside it so long as the underlying kind conforms to the required protocol, thus permitting us to do one thing that an opaque kind doesn’t enable us to do.

The very best half is that, in Swift 5.7, we will now use the any key phrase for protocols with related sorts! Because of this making a heterogeneous array utilizing a protocol with related sorts is now not a limitation!

How cool is that? 😃

This enchancment not solely eradicated the “protocol can solely be used as a generic constraint as a result of it has Self or related kind necessities” error, however it additionally makes carrying out dynamic dispatch on protocol with related sorts much more easy! However that will probably be an article for one more day.

Pretty much as good because it might sound, the existential kind created utilizing the any key phrase nonetheless has its personal limitations. One main limitation is that we can not use the == operator to check two situations of the existential kind.

If you concentrate on it, this truly sort of is smart. As talked about earlier, an existential kind can have any concrete kind saved in its “field”. To the compiler, an existential kind is only a “field”, it has no thought what’s contained in the field. Due to this fact, it’s not potential for the compiler to make a comparability when it can not assure that the content material of the “field” has the identical underlying concrete kind.

One other limitation that you need to be conscious of is that the existential sorts are much less environment friendly than the opaque sorts (created utilizing the some key phrase). Donny Wals has a terrific article that discusses this in a lot element, I extremely advocate you to test it out.

Due to this fact, despite the fact that Apple has made a number of enhancements on the any key phrase, it’s nonetheless beneficial to make use of the some key phrase if the opaque sorts can get the job achieved.

Improvements to any types in Swift 5.7 = improvements to any types. the any keyword, pass generic arguments, supports self and associated types, primary associated types but you still shouldn’t use them when generics will work
Supply: What’s new in Swift

The enhancements to the any and some key phrases in Swift 5.7 is unquestionably a welcome one. On one hand, it drastically improved the syntax and readability of our generic code. Alternatively, it opens up new methods for us to write down generic code in a way more environment friendly method.

I hope this text offers you a great look into the any and some key phrase. Be at liberty to comply with me on Twitter so that you just received’t miss out on any of my upcoming articles.

Thanks for studying.

More Posts