Создайте структуру управления forCount в Swift

Во многих проектах эта структура управления идеальна для удобства чтения:

forCount( 40 )
 {
 // this block is run 40 times
 }

Вы можете сделать именно это в Objective-C.

Учитывая, что у Swift совершенно другой подход к макросам, чем у target-c,

есть ли способ создать такую ​​структуру управления forCount(40) в проектах Swift?


Некоторые похожие концепции в Swift:

for _ in 1...40
 { // this block is run 40 times }

Используя гениальное расширение для Int...

40.times
 { // this block is run 40 times }

person Fattie    schedule 17.09.2015    source источник
comment
Привет, Мартин, трюк с расширением 5.times потрясающий, и я действительно благодарю вас, но мне действительно интересно, есть ли способ заставить wordHere(n) работать синтаксически, как это легко можно сделать, когда есть препроцессор. Как говорится в вопросе. Не то, чтобы искали кратчайший способ сделать это.   -  person Fattie    schedule 17.09.2015
comment
Тогда я неправильно понял ваш вопрос (извините за это!), Я повторно открыл его.   -  person Martin R    schedule 17.09.2015
comment
au contraire, спасибо всем вокруг! вопросы должны были быть закрыты открытыми и закрытыми!   -  person Fattie    schedule 17.09.2015
comment
@MartinR, увлекательно, спасибо за это! Ключ для каждого игрового инженера   -  person Fattie    schedule 28.06.2018
comment
Этот форум открыт для всех — вы можете поделиться своими аргументами!   -  person Martin R    schedule 28.06.2018
comment
Я был бы слишком застенчивым человеком! там все про пользователи! :О   -  person Fattie    schedule 28.06.2018


Ответы (2)


В Swift нет макросов препроцессора, но вы можете определить глобальную функцию, принимающую количество итераций и замыкание в качестве аргументов:

func forCount(count : Int, @noescape block : () -> ()) {
    for _ in 0 ..< count {
        block()
    }
}

С "синтаксисом завершающего замыкания" это выглядит как встроенный управляющий оператор:

forCount(40) {
    print("*")
}

Атрибут @noescape позволяет компиляции выполнять некоторые оптимизации и ссылаться на переменные экземпляра без использования self, см. @noescape в Swift 1.2 для получения дополнительной информации.

Начиная с Swift 3 "noescape" является атрибутом по умолчанию для параметров функции:

func forCount(_ count: Int, block: () -> ()) {
    for _ in 0 ..< count {
        block()
    }
}
person Martin R    schedule 17.09.2015
comment
Мартин, здорово помочь новому пользователю, отправив более 100 баллов :) - person Fattie; 22.09.2015

ты можешь сделать

let resultArr = (0..<n).map{$0+5}

or

(0..<n).forEach{print("Here\($0)")}
person GreatWiz    schedule 31.05.2018