当前位置: 首页 > 面试题库 >

如何在Swift中执行一次代码?

法池暝
2023-03-14
问题内容

到目前为止,我已经看到了这些问题的答案2,)建议使用GCD的dispatch_once这样:

var token: dispatch_once_t = 0
func test() {
    dispatch_once(&token) {
        print("This is printed only on the first call to test()")
    }
    print("This is printed for each call to test()")
}
test()

输出:

This is printed only on the first call to test()
This is printed for each call to test()

等一下 token是一个变量,因此我可以轻松做到这一点:

var token: dispatch_once_t = 0
func test() {
    dispatch_once(&token) {
        print("This is printed only on the first call to test()")
    }
    print("This is printed for each call to test()")
}
test()

token = 0

test()

输出:

This is printed only on the first call to test()
This is printed for each call to test()
This is printed only on the first call to test()
This is printed for each call to test()

所以,dispatch_once是没有用的,如果我们我可以改变的价值token!转换token成常量并非易事,因为它需要类型化UnsafeMutablePointer<dispatch_once_t>

那么我们应该放弃dispatch_onceSwift吗?有没有一种安全的方法可以只执行一次代码?


问题答案:

由闭包初始化的静态属性是延迟运行的,最多只能运行一次,因此尽管被调用了两次,但它仅打印一次:

/*
run like:

    swift once.swift
    swift once.swift run

to see both cases
*/
class Once {
    static let run: Void = {
        print("Behold! \(__FUNCTION__) runs!")
        return ()
    }()
}

if Process.arguments.indexOf("run") != nil {
    let _ = Once.run
    let _ = Once.run
    print("Called twice, but only printed \"Behold\" once, as desired.")
} else {
    print("Note how it's run lazily, so you won't see the \"Behold\" text now.")
}

示例运行:

~/W/WhenDoesStaticDefaultRun> swift once.swift
Note how it's run lazily, so you won't see the "Behold" text now.
~/W/WhenDoesStaticDefaultRun> swift once.swift run
Behold! Once runs!
Called twice, but only printed "Behold" once, as desired.


 类似资料:
  • 问题内容: 我似乎无法找出如何在Swift 2中进行操作。 我试着做 那不行 helloworld是一个变量 问题答案: 是。在swift 2.0中进行了更改,您需要访问Apple网站。放而不是

  • 问题内容: 如何每分钟运行一个函数?在JavaScript中,我可以做类似的事情,在Swift中是否存在类似的事情? 想要的输出: 你好世界每分钟一次… 问题答案: 记住要导入基金会。 斯威夫特4:

  • 问题内容: 我正在编写一个Django中间件类,该类只想在启动时执行一次,以初始化一些其他人工代码。我遵循了sdolan 在此处发布的非常好的解决方案,但是“ Hello”消息两次输出到终端。例如 在我的Django设置文件中,该类已包含在列表中。 但是当我使用runserver运行Django并请求页面时,我进入了终端 有什么想法为什么要打印两次“ Hello world”?谢谢。 问题答案:

  • 这是我的减速器。Reducer具有可边写和可空写功能 EdgeWritable有4个整数,例如<71,74,7,2000>通信在71(FromID)到74(ToID)on 7(7月)2000(Year)之间。 映射器输出10787条记录到reducer,但reducer只输出1条。 我需要输出44个文件与44个月之间的时期从1998年10月至2002年7月。输出的格式应该是“out”+month+

  • 问题内容: 除了以下内容之外,是否有其他方法/软件可以给出执行用Swift编写的代码块所需的准确时间? 问题答案: 如果您只想为代码块提供独立的计时功能,则可以使用以下Swift助手功能: 前者将注销给定代码段所需的时间,后者将返回该时间作为浮点数。作为第一个变体的示例: 将注销类似: map()经过的时间:0.0617449879646301 s 请注意,Swift基准测试会根据您选择的优化级别