2015-01-27 3 views
2

Как и большинство языков, Swift поддерживает переменные ограниченной области действия в условных выражениях, петлях и т. Д., Однако он, похоже, не поддерживает простой блок сам по себе, что является позором, поскольку я считаю его очень полезным способом ограничить область действия переменных, особенно дорогостоящих, которые могут потребоваться для полной длины функции.Возможно ли ограничить область в Swift?

Например, я мог бы сделать что-то подобное (с использованием Swift в качестве примера, так как это не будет в настоящее время компиляции):

var results = [] 
while let newResult = someFunction() { results.append(newResult) } 

{ 
    var newItems = [] 
    while let newItem = foobar() { newItems.append(newItem) } 
    // Process newItems into results so we can add them 
    results += newItems 
} 

// Do some more stuff down here 

Она также может быть очень удобно для общих названий заполнителей, но которые могут иметь различные типы в разных частях исполнения. Хотя я мог бы объявлять разные имена, это может на самом деле оказаться более запутанным или беспорядочным, чем просто повторное использование хорошего имени переменной с четко обозначенной областью.

Конечно, я могу сделать что-то вроде if true {}, чтобы немного обмануть, но это кажется ненужным. Так есть способ, которым я могу просто объявить область/блок без необходимости вставлять условное выражение?

Я знаю, что это может быть связано с тем, как могут быть образованы замыкания, но есть ли способ сделать что-то подобное исключительно для ограничения области переменных в Swift?

+0

переменная сфера = «стоимость» – user2864740

+0

@ user2864740 могли бы вы уточнить, что вы имеете в виду? Вы подразумеваете, что использование закрытий и т. Д. Непригодно в качестве средства для этого? Разве они просто не скомпилируются? – Haravikk

ответ

0

Что я делаю, это определение анонимной функции и ее выполнение.

{ 
    () ->() in 
    var newItems = [] 
    while let newItem = foobar() { newItems.append(newItem) } 
    // Process newItems into results so we can add them 
    results += newItems 
}() 

Вы могли бы поставить точку с запятой в конце предыдущей строки, так Свифт не думает думать, что это «задний затвор».

+0

Я не думаю, что компилируется. –

+0

это тоже не работает. Вы должны назначить его чему-то. –

+0

Поместите объявление переменной перед закрытием и посмотрите, работает ли оно тогда. –

0

я сделать это таким образом, работает на детской площадке:

var foo = "bar" 

let _ = {() ->() in 
    var foo = "nope" 
    println(foo) 
}() 

println(foo) 
Смежные вопросы