2014-09-21 2 views
4

Я играю с Swift. Почему можно объявить let тип в цикле? Насколько мне известно, let означает постоянный, поэтому я смущен.Пусть тип в a для петли

func returnPossibleTips() -> [Int : Double] { 
     let possibleTipsInferred = [0.15, 0.18, 0.20] 
     //let possibleTipsExplicit:[Double] = [0.15, 0.18, 0.20] 

     var retval = Dictionary<Int, Double>() 
     for possibleTip in possibleTipsInferred { 
      let inPct = Int(possibleTip * 100) 
      retval[inPct] = calcTipWithTipPct(possibleTip) 
     } 

    return retval 

    } 
+1

'let' определяет область действия на основе постоянная - в вашем случае в течение петли. Это в основном означает, что присвоение нового значения переменной, объявленной с помощью «let», невозможно. – Eugene

+1

Подумайте об этом в терминах 'var'' 'Mutable' и' let' '' Immutable' вместо константы. – barrett

ответ

5

Продолжительность жизни константы inPct только при итерации цикла, поскольку она является блок-областью действия:

for i in 1...5 { 
    let x = 5 
} 
println(x) // compile error - Use of unresolved identifier x 

В каждой итерации inPct относится к новой переменной. Вы не можете назначить любой из inPct с любой итерации, так как они были объявлены с let:

for i in 1...5 { 
    let x = 5 
    x = 6 // compile error 
} 
1

В основные слова, когда вы определяете: let possibleTipsInferred = [0.15, 0.18, 0.20] это означает, что possibleTipsInferred является только для чтения переменной. Вы можете перебирать его, но не изменять.

Кроме того, в Swift вы не можете написать:

let a:Int? 
a = 5  // compile ERROR 

потому что a имеет значение nil, и вы не можете его изменить.


в for..in петли, каждая итерация i является воссоздана и получает новый экземпляр за цикл.

Поэтому вы можете сделать это постоянным и написать let.

0

Цикл for выполняет серию утверждений, поэтому каждый раз, когда мы проходим цикл, мы находимся в новой «области». Это очень похоже на то, как C обрабатывает петли.

Каждый раз, когда мы запускаем цикл for, стоп-константа освобождается, поэтому мы можем переназначить значение inPct.

Если мы предопределили переменную за пределами цикла for и дали ей значение, мы обновили бы значение переменной каждый раз, когда мы проходили через цикл for.

Вот ссылка на Документы для петель в скор: Control Flow