Swift: не может развернуть дополнительный цикл внутри - PullRequest
1 голос
/ 04 октября 2019

Я не могу понять, почему развёртывание необязательного значения возможно в этом случае:

let name: String? = "Toto"
guard let name = name else { fatalError() }
print(name)

, но не тогда, когда этот фрагмент заключен в цикл for:

for _ in 0..<100 {
  let name: String? = "Toto"
  guard let name = name else { fatalError() }
  print(name)
}

Я получил ошибку «Определение конфликтует с предыдущим значением».

Использование Swift 5 в Xcode 11.0.

1 Ответ

3 голосов
/ 04 октября 2019

Как объяснено в Почему guard не допускает, что foo = foo действует? ,

let name: String? = "Toto"
guard let name = name else { fatalError() }

недопустимо, поскольку guard не вводит новую область, и вы не можетеесть две переменные с одинаковыми именами в одной и той же области видимости.

То, что это компилируется на уровне файлов (то есть в «main.swift»), является ошибкой. Очевидно, переменная, связанная через guard, скрывает другую переменную с тем же именем, независимо от типа и порядка, в котором они объявлены:

let aName = "Toto"
guard let aName = Int("123") else { fatalError() }
print(aName) // 123

guard let bName = Int("123") else { fatalError() }
let bName = "Toto"
print(bName) // 123

Эта ошибка была зарегистрирована как SR-1804 Нет ошибки компилятора для переопределения переменной, связанной guard .

...