Variable Shadowing

Do not shadow variables declared in outer scopes

  • Identifier: variable_shadowing
  • Enabled by default: No
  • Supports autocorrection: No
  • Kind: lint
  • Analyzer rule: No
  • Minimum Swift compiler version: 5.0.0
  • Default configuration:
    KeyValue
    severity warning
    ignore_parameters true

Non Triggering Examples

//
// ignore_parameters: true
//

var a: String?
func test(a: String?) {
    print(a)
}

var a: String = "hello"
if let b = a {
    print(b)
}
var a: String?
func test() {
    if let b = a {
        print(b)
    }
}
for i in 1...10 {
    print(i)
}
for j in 1...10 {
    print(j)
}
func test() {
    var a: String = "hello"
    func nested() {
        var b: String = "world"
        print(a, b)
    }
}
class Test {
    var a: String?
    func test(a: String?) {
        print(a)
    }
}
var outer: String = "hello"
if let inner = Optional(outer) {
    print(inner)
}
var a: String = "outer"
let (b, c) = ("first", "second")
print(a, b, c)
class Test {
    var property: String = "class property"
    func test() {
        var localVar = "local"
        print(property, localVar)
    }
}
func outer() {
    func inner() {
        print("no shadowing")
    }
}
var result: String?
if let unwrappedResult = result {
    print(unwrappedResult)
}
var value: Int? = 10
guard let safeValue = value else {
    return
}
print(safeValue)
var data: [Int?] = [1, nil, 3]
for case let item? in data {
    print(item)
}
let a: Int?
if let a { print(a) }
let a: Int?
guard let a else { return }
let a: Int?
while let a { print(a) }
var a = 1
if let a = a {
    print(a)
}
func test() {
    var a = 1
    var b = 2
}

Triggering Examples

var outer: String = "hello"
func test() {
    let outer = "world"
    print(outer)
}
var x = 1
do {
    let x = 2
    print(x)
}
var counter = 0
func incrementCounter() {
    var counter = 1
    counter += 1
}
func outer() {
    var value = 10
    do {
        let value = 20
        print(value)
    }
}
var globalName = "global"
func test() {
    for item in [1, 2, 3] {
        var globalName = "local"
        print(globalName)
    }
}
var foo = 1
do {
    let foo = 2
}
var bar = 1
func test() {
    let bar = 2
}
var a = 1
if let a = Optional(2) {
    let a = 3
    print(a)
}
var i = 1
for i in 1...3 {
    let i = 2
    print(i)
}
func test() {
    var a = 1
    do {
        var a = 2
        print(a)
    }
}
func test() {
    var a = 1
    if true {
        var a = 2
        print(a)
    }
}
func test() {
    var a = 1
    for _ in 0..<1 {
        var a = 2
        print(a)
    }
}
func test() {
    var a = 1
    while true {
        var a = 2
        break
    }
}
var a = 1
if let a = Optional(2) {}
var i = 1
for i in 1...3 {}
//
// ignore_parameters: false
//

var a: String?
func test(a: String?) {
    print(a)
}

struct S {
    var a = 1
    var b: Int {
        let a = 2
        return a
    }
}
var a: String?
while let a = Optional("hello") {}
var a: String?
guard let a = Optional("hello") else { return }