This code contains four different instructions; it first looks in the collection of windows for a window with the name "Main", then looks in that window's views collection for the 5th subview within it, then calls the size method to return a structure with the view's dimensions, and finally calls the width method on that structure to produce a result that is assigned to a variable name theWidth. The problem with this approach is that the code assumes that all of these values exist. While it is reasonable to expect that a window will have a size and that size will have a width, it is not at all reasonable to assume that a window named "Main" will exist, nor that it has five subviews. If either of those assumptions is wrong, one of the methods will be invoked on null, producing a null pointer error. To avoid this error, the programmer has to check every method call to ensure it returns a value. A safer version of the same code would be: if windows.contains
If the programmer wishes to use that value based on whether or not it exists and is valid, the functional code inside the if statements is all pushed to the right, making it difficult to read longer lines. This often leads to attempts to "flatten" the code: if windows.contains if theWindow != null && theWindow.views.contains if theView != null
Or alternatively: if !windows.contains else if !windows.views.contains else
This sort of programming construct is very common and a number of programming languages have added some sort of syntactic sugar to address this. For instance, Apple's Swift added the concept of optional chaining in if statements while Microsoft's C# 6.0 and Visual Basic14 added the null-conditionaloperators?. and ? for member access and [indexing, respectively. The basic idea is to allow a string of method calls to immediately return null if any of its members is null, so for instance: theWidth = windows?.views?.size.width;
would assign null to theWidth if either "Main" or the fifth subview is missing, or complete the statement and return the width if they are both valid. There are many times where the programmer wants to take different actions in these two cases, so Swift adds another form of syntactic sugar for this role, the if let statement, also known as "optional binding": if let theView = windows?.views