一尘不染

我可以让#selector引用Swift中的闭包吗?

swift

我想让selector我的方法的参数引用一个闭包属性,它们都存在于同一作用域中。例如,

func backgroundChange() {
    self.view.backgroundColor = UIColor.blackColor()
    self.view.alpha = 0.55

    let backToOriginalBackground = {
        self.view.backgroundColor = UIColor.whiteColor()
        self.view.alpha = 1.0
    }

    NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: #selector(backToOriginalBackground), userInfo: nil, repeats: false)
}

但是,这显示错误:Argument of #selector cannot refer to a property

当然,我可以定义一个新的单独方法,并将闭包的实现移到该方法上,但是对于这样小的实现,我想保持节俭。

是否可以为#selector参数设置闭包?


阅读 318

收藏
2020-07-07

共1个答案

一尘不染

就像@
gnasher729指出的那样,这是不可能的,因为选择器只是方法的名称,而不是方法本身。在一般情况下,我会dispatch_after在这里使用,但是在这种特殊情况下,更好的工具IMO是UIView.animateWithDuration,因为它正是该功能的作用,并且很容易调整过渡:

UIView.animateWithDuration(0, delay: 0.5, options: [], animations: {
    self.view.backgroundColor = UIColor.whiteColor()
    self.view.alpha = 1.0
}, completion: nil)
2020-07-07