In languages with block level scope, I sometimes create arbitrary blocks just so I can encapsulate local variables and not have them pollute their parents' scope:
func myFunc() {
// if statements get block level scope
if self.someCondition {
var thisVarShouldntExistElsewhere = true
self.doSomethingElse(thisVarShouldntExistElsewhere)
}
// many languages allow blocks without conditions/loops/etc
{
var thisVarShouldntExistElsewhere = false
self.doSomething(thisVarShouldntExistElsewhere)
}
}
When I do this in Swift, it thinks I'm creating a closure and doesn't execute the code. I could create it as a closure and immediately execute, but that seems like it would come with execution overhead (not worth it just for code cleanliness).
func myFunc() {
// if statements get block level scope
if self.someCondition {
var thisVarShouldntExistElsewhere = true
self.doSomethingElse(thisVarShouldntExistElsewhere)
}
// converted to closure
({
var thisVarShouldntExistElsewhere = false
self.doSomething(thisVarShouldntExistElsewhere)
})()
}
Is there support for something like this in Swift?
You can use a do
statement to create arbitrary scope in Swift. For example:
func foo() {
let x = 5
do {
let x = 10
print(x)
}
}
foo() // prints "10"
As per The Swift Programming Language:
The do statement is used to introduce a new scope and can optionally contain one or more catch clauses, which contain patterns that match against defined error conditions. Variables and constants declared in the scope of a do statement can be accessed only within that scope.
A do statement in Swift is similar to curly braces (
{}
) in C used to delimit a code block, and does not incur a performance cost at runtime.Ref: The Swift Programming Language - Language Guide - Statements - Do Statement
An alternative to @Jack Lawrence's answer is to use blocks; similar to the block in your first code snippet.
func foo () {
let x = 5
let block = {
let x = 10
print(x)
}
block()
}
foo()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With