【问题标题】:Create a "forCount" control structure in Swift在 Swift 中创建一个“forCount”控制结构
【发布时间】:2015-12-14 10:44:02
【问题描述】:

在许多项目中,这种控制结构非常适合可读性:

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

你可以在 Objective-C 中做exactly that

鉴于 Swift 与 Objective-c 相比,宏的处理方法非常不同,

有没有办法在 Swift 项目中创建这样的forCount(40) 控制结构?


Swift 中的一些类似概念:

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

使用ingenious extension to Int ...

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

【问题讨论】:

  • 嗨马丁,“5.times”扩展技巧非常棒,我非常感谢你,但我真的想知道是否有一种方法可以使 wordHere(n) 在语法上工作,因为可以当有预处理器时很容易。正如问题中所说。与其寻找最短的方法来做到这一点。
  • 那我误解了你的问题(对不起!),我重新打开了它。
  • 相反,谢谢大家!问题本来是封闭的,开放的和封闭的!
  • 为 Swift 语言添加“重复 N 次”功能目前正在 Swift 进化论坛上讨论:forums.swift.org/t/straightforward-code-repetition/13828

标签: swift macros preprocessor language-features


【解决方案1】:

你可以的

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

(0..<n).forEach{print("Here\($0)")}

【讨论】:

    【解决方案2】:

    Swift 中没有预处理器宏,但您可以定义一个全局函数,将迭代次数和闭包作为参数:

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

    使用“尾随闭包语法”,它看起来就像一个内置的 控制语句:

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

    @noescape 属性允许编译器进行一些优化 并在不使用 self 的情况下引用实例变量,请参阅 @noescape attribute in Swift 1.2 了解更多信息。

    Swift 3 开始,“noescape”是函数的默认属性 参数:

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

    【讨论】:

    • Martin,很高兴通过发送超过 100 分来帮助像您这样的新用户 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多