Swift - 'when'运算符(如果重复?)

时间:2014-12-19 17:56:15

标签: if-statement swift concurrency while-loop

在Swift中,if'继续检查'。 I.E.将更改变量时调用其函数。我有变量playBegin,它在我的程序中途改变了。但是,变量playBegin不是直接在更改中实现代码,而是设置为' true'并且代码在别处执行。基本上我的问题是:if会更新并检查其变量的状态,还是我必须使用别的东西?

在此声明中表现得像when

when playBegin {
    // blahdeblah
}

什么是when的良好替代品? playBegin通常为false,但在整个计划中途变为true

3 个答案:

答案 0 :(得分:1)

drewag的回答是正确的。此外,如果您希望代码始终至少执行一次:

do {
    // blahdeblah
} while playBegin == true

答案 1 :(得分:0)

如果你希望重复此操作直到playBegin不再为真,你可以这样做:

while playBegin == true {
    // blahdeblah
}

如果你只是想让它在playBegin为真时执行一次,你会使用if语句:

if playBegin == true {
    // blahdeblah
}

答案 2 :(得分:0)

其实Anna Dickinson有一个好主意:使用观察者。

为此,您需要设置一个类:

class SomeObserverClass
{
    var playBegin:Bool = false
        {
        willSet(playBegin) {
            println("About to set playBegin to \(playBegin)")
        }
        didSet {
            if playBegin == true  {
                // your code when playBegin == true
                println("playBegin set to  \(playBegin)")
            }
        }
    }
}

在AppDelegate文件中,AppDelegate类上方(外部)实例化此类:

internal let someObserverClass:SomeObserverClass = SomeObserverClass()

然后在你的代码中的某个地方,如果你说的话:

someObserverClass.playBegin = someBoolValue

将执行观察者类代码。

编辑:

我不确定你的意思是“精心制作”,但我会尝试。

observer属性是一种特殊的类属性。例如,如果您有一个类:

class SomeClass
{
    var someBool:Bool = false

    func someFunction()
    {
        ... some code ....
    }

    func someOtherFunction
    {
        ... some other code ....
    }
}

然后someBool是SomeClass的类属性。

可以从具有SomeClass实例可见性的任何其他类访问SomeClass的属性和方法。例如如果您在AppDelegate类之外(上方)的AppDelegate文件中创建了SomeClass的实例(以便项目中的任何类都可以看到它):

internal let someClass:SomeClass = SomeClass() 

然后可以从项目的任何位置更改变量some​​Bool的值,如:

someClass.someBool = true.

或someFunction可以用:

执行
someClass.someFunction()

好的,这是基本的东西。

现在有了一个观察者,除了我们声明类属性someBool时,我们还定义了一些我们希望在属性(变量)被更改时执行的代码。在下面的代码中,对SomeClass的唯一更改是我添加了此代码。

class SomeClass
{
    var someBool:Bool = false
    { 
        willSet
        {
            println("someBool is about to be changed from \(someBool)")
        }
        didSet
        {
            if someBool == true  
            {
                // your code when someBool is true
                println("someBool set to  \(someBool)")
            }else{
                println("someBool set to  \(someBool)")
            }
        }
    }

    func someFunction()
    {
        ... some code ....
    }

    func someOtherFunction
    {
        ... some other code ....
    }
}

如果你在项目的其他地方写了:

someClass.someBool = true
someClass.someBool = false
someClass.someBool = true

你会得到:

someBool即将从false

更改

someBool设为true

someBool即将从真正的

改变

someBool设为false

someBool即将从false

更改

someBool设为true

其中一个变体是:

class SomeClass
{
    var someBool:Bool = false
    { 
        willSet(someBool)
        {
            println("someBool is about to be changed to \(someBool)")
        }
        didSet
        {
            if someBool == true  
            {
                // your code when someBool is true
                println("someBool set to  \(someBool)")
            }else{
                println("someBool set to  \(someBool)")
            }
        }
    }

    func someFunction()
    {
        ... some code ....
    }

    func someOtherFunction
    {
        ... some other code ....
    }
}

如果你在项目的其他地方写了:

someClass.someBool = true
someClass.someBool = false
someClass.someBool = true

你会得到:

someBool即将更改为true

someBool设为true

someBool即将更改为false

someBool设为false

someBool即将更改为true

someBool设为true

另一个变化可能是:

class SomeClass
{
    var someBool:Bool = false
    { 
        willSet(newBool)
        {
            println("someBool is about to be changed from \(someBool) to \(newBool)")
        }
        didSet
        {
            if someBool == true  
            {
                // your code when someBool is true
                println("someBool set to  \(someBool)")
            }else{
                println("someBool set to  \(someBool)")
            }
        }
    }

    func someFunction()
    {
        ... some code ....
    }

    func someOtherFunction
    {
        ... some other code ....
    }
}

如果你在项目的其他地方写了:

someClass.someBool = true
someClass.someBool = false
someClass.someBool = true

你会得到:

someBool即将从false更改为true

someBool设为true

someBool即将从true更改为false

someBool设为false

someBool即将从false更改为true

someBool设为true

不需要if,do或while语句。每当类属性(变量)发生变化时,都会执行willSet和didSet代码。

您不需要同时实现willSet和didSet。如果你愿意,你可以把它们中的任何一个留下来。

此外,在类初始化期间,不会执行willSet和didSet代码。

我认为这更接近你的“何时”陈述的意图而不是其他任何东西。