Swift-防止函数被两次调用

时间:2018-09-27 20:38:56

标签: swift

我的主要代码要放在这里很久了,所以我将尝试以更简单的解释。假设我有一个名为“ count”的全局变量,该变量将被函数使用。如果计数由于某种原因被调用两次,如下面的代码所示……我该如何使其输出为“ 10,10”而不是“ 10,20”。

var count = 0

override func viewDidLoad() {

  helloWorld()

}


override func viewWillAppear(_ animated: Bool) {
    helloWorld()
}



func helloWorld(){
    var counter = 0
    for i in 1...10{
        count = count + 1
        counter = counter + 1
    }
    print(count)
}

2 个答案:

答案 0 :(得分:1)

使用具有静态令牌的DispatchQueue(通过应用程序生命周期缓存),这是一个有用的扩展:

$('#peoplelist p').text('');

$('#peoplelist p').wrapInner('Chris<br>Jean<br>Vic<br>Sen<br>Roger<br>John<br>Dan<br>Vany');

“此操作应执行一次”将仅打印一次。

您还可以使用惰性机制:

extension DispatchQueue {

    private static var tokens: [String] = [] // static, so tokens are cached

    class func once(executionToken: String, _ closure: () -> Void) {
        // objc_sync_enter/objc_sync_exit is a locking mechanism
        objc_sync_enter(self)
        defer { objc_sync_exit(self) }
        // if we previously stored token then do nothing
        if tokens.contains(executionToken) { return }
        tokens.append(executionToken)
        closure()
    }
}

func doSomething() {
    DispatchQueue.once(executionToken: "doSomething") {
        print("This should be executed once")
    }
}

doSomething()
doSomething()
doSomething()

开箱即用是线程安全的,因此您不必担心锁定。

答案 1 :(得分:0)

更改

func helloWorld(){
var counter = 0
for i in 1...10{
    count = count + 1
    counter = counter + 1
}
print(count)
}

func helloWorld(){
var counter = self.count
for i in 1...10{
    count = count + 1
}
print(count)
self.count = counter
}

这样,您可以在计数值更改之前将其存储到计数器中,然后再次使其等于前一个值。

  

注意: 这样,无论调用该函数多少时间,调用helloWorld()都将始终获得10。

您可以如下所示更改功能:

func helloWorld(_ countValue: Int){
var counter = self.count
for i in 1..<countValue{
    count = count + 1
}
print(count)
self.count = counter

}

因此,您只需调用以下即可选择计数器的上部元素:

helloWorld(10)
helloWorld(20)
  

咨询: :具有更改外部值的功能不是一个好习惯

相关问题