在Swift中,if
'继续检查'。 I.E.将更改变量时调用其函数。我有变量playBegin
,它在我的程序中途改变了。但是,变量playBegin
不是直接在更改中实现代码,而是设置为' true'并且代码在别处执行。基本上我的问题是:if
会更新并检查其变量的状态,还是我必须使用别的东西?
在此声明中表现得像when
:
when playBegin {
// blahdeblah
}
什么是when
的良好替代品? playBegin
通常为false
,但在整个计划中途变为true
。
答案 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()
然后可以从项目的任何位置更改变量someBool的值,如:
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代码。
我认为这更接近你的“何时”陈述的意图而不是其他任何东西。