Regardless of what you think about Apple’s new language Swift – it has fixed many of the underlying issues with C, and it’s descendants. The number one thing may be that they actually gave the language a new name that it *not* related in anyway to C. Some will see it as some form of evolution of Objective-C, but it’s not. Language design has always involved taking design prompts from existing languages. Since its inception in the early 1970s, few have attempted to fix some of the inadequacies of its language structure. What are some of its “fixes”?
Strings are fully supported
Unlike C, where strings are character arrays, strings in Swift are represented by the String type. This makes life easier, because operations like equality can now be done using ==. The downside? It is not possible to access an element of a string via an integer index (although it is still possible to access it). There is a cornucopia of information on Swift strings here at Ole Begemann’s blog.
Assignments do not return a value
One of the problems in C is code of the form:
if (x = y){
i = x + 1;
vortex[i] = 0;
}
This effectively does not compare x and y, but assigns the value of y to x which is always true (unless y is zero). The assignment operator in Swift does not itself return a value, preventing the use of i=0 instead of i==0 in if statements.
No need to use break statements in switch blocks.
The case statements in Swift do not fall through the bottom of each case and into the next one by default. To do that you have to explicitly use the fallthrough clause.
switch does intervals.. AND compound cases
Finally! A switch statement that allows for intervals in the case clauses.
let grade = 73
var lettergrade: String
switch grade {
case 0..<50: lettergrade = "F"
case 50..<60: lettergrade = "D"
case 60..<70: lettergrade = "C"
case 70..<80: lettergrade = "B"
case 80..100: lettergrade = "A"
}
And even compound cases.
let ch: Character = "o"
switch ch {
case "a", "e", "i", "o", "u": print("vowel")
default: print("consonant")
}
Integer overflows are trapped as a run-time error.
Can be allowed through the use of a special integer operators: &+, &-, &*, &/, and &%.
Braces in if are not optional
In C, you can write a single statement after an if, and there is no issue. Multiple statements require the use of braces { }, to contain the statements. This can lead to programming errors in code when people forget to include the braces. For example:
if (x > y)
printf("%d is greater than %d\n", x, y);
max = x;
Here the last statement is executed regardless of whether x is greater than y or not, because the braces have been omitted. Swift does not allow for the omission of braces around the statement, they are mandatory… so no more issues like the example above. (Or dangling-else for that matter)
The use of for-in
Swift provides a for of the for loop which allows iteration over “containers”, or numeric ranges. For example:
for index in 1...5 {
print("\(index) times 5 is \(index * 5)")
}
printf be gone!
As you will notice from the previous example, the values are printed out using an overloaded print statement.
do-while becomes repeat-while
Just a small thing I guess, but the word repeat is more meaningful from a looping perspective than do (especially to novice programmers).
NO GOTO
Another language decides that enough of goto is enough. It’s not there, so don’t look for it. Surprisingly you can create a similar feature (and here is a blog post that shows you how).
FUNCTIONS RETURN MORE THAN ONE VALUE
Yes, like many of its contemporaries, Swift allows more than one value to be returned via a tuple.
func circle(radius: Double) -> (Double, Double) {
var area=0.0, circumference=0.0
area = 3.14159 * radius * radius
circumference = 2.0 * 3.14159 * radius
return (area, circumference)
}
This is called in this manner:
let values = circle(7.0)
print("area is \(values.0) and circumference is \(values.1)")
There are *many* other features, like the use of optional parentheses in control structures. I kind of like the type inference as well. Both these are the same.
var life:Int = 42
var life = 42
You can also run Swift as an interactive session from the terminal. For more basics try Swift by Example.