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

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

周健
2023-03-14
问题内容

我想让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参数设置闭包?


问题答案:

就像@
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)


 类似资料:
  • 问题内容: 我正在尝试创建一个in,但是遇到了一些麻烦。 是同一个类中的函数。 我在编辑器中遇到错误: 找不到接受提供的参数的’init’的重载 当我更改为错误时消失。 我试过了: 但是没有任何效果,我在参考文献中找不到解决方案。 问题答案: Swift 本身 不使用选择器-在Objective-C中,使用选择器的几种设计模式在Swift中的工作方式有所不同。(例如,在协议类型或/ 测试上使用可选

  • 问题内容: 编译器错误Closure use of non-escaping parameter ‘completion’ may allow it to escape,这是有道理的,因为它将在函数 返回之后被调用。 但是,如果我将闭包设为可选,则不会出现编译器错误,那是为什么呢? 函数返回后仍可以调用闭包。 问题答案: Clarification: 为了理解这种情况,实现以下代码将很有用: 乍一

  • 闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。 Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的 匿名函数比较相似。 全局函数和嵌套函数其实就是特殊的闭包。 闭包的形式有: 全局函数 嵌套函数 闭包表达式 有名字但不能捕获任何值。 有名字,也能捕获封闭函数内的值。 无名闭包,使用轻量级语法,可以根据上下

  • 问题内容: 我相信我遇到了一个问题,即我的关闭发生在后台线程上,而UITableView的更新速度不够快。我正在打电话给REST服务,而在关闭时,我有一个电话,但是要花几秒钟的时间才能发生。如何使数据重新加载更快(也许在主线程上?) REST查询功能-使用SwiftyJSON库进行解码 在调试器中调用一次 问题答案: UIKit不是线程安全的。UI仅应从主线程更新: 更新 。在Swift 3及更高

  • 问题内容: 我想完全消除HttpSession- 我可以在web.xml中这样做吗?我敢肯定,有一些特定于容器的方法可以做到这一点(当我进行Google搜索时,搜索结果会很拥挤)。 PS这是个坏主意吗?在我真正需要它们之前,我宁愿完全禁用它们。 问题答案: 我想彻底消除HttpSession 您不能完全禁用它。您需要做的就是 不要 在Web应用程序的代码中任何地方或任何地方都得到它的句柄,并确保您

  • 我有一个,其形式为: 但是我得到错误:< code >将非转义参数“someOtherClosure”传递给需要@escaping闭包的函数。 这两个闭包实际上都是不可转义的(默认情况下),并且显式地将添加到会产生一个警告,表明这是Swift 3.1中的默认值。 知道我为什么会得到这个错误吗?