使用NSTimer的重复功能在Swift中使用target:self失败

时间:2016-05-22 15:02:18

标签: swift nstimer

我找到this question并试图将代码复制到我的Xcode项目中,但是我收到以下错误消息。

  

错误:使用未解析的标识符'self'

什么是正确的方式?

编辑:这里是在游乐场测试的代码:

    //: Playground - noun: a place where people can play

import Cocoa
import Foundation

func sayHello() {
    print("hello World")
}

var SwiftTimer = NSTimer()
SwiftTimer = NSTimer.scheduledTimerWithTimeInterval(1, target:self, selector: Selector("sayHello"), userInfo: nil, repeats: true)

3 个答案:

答案 0 :(得分:0)

通常在属性名称中使用大写字母它被认为是一种不好的态度,你应该使用swiftTimer。

顶层不允许使用这些表达式:

var swiftTimer = NSTimer()
swiftTimer = NSTimer.scheduledTimerWithTimeInterval(1, target:self, selector: Selector("sayHello"), userInfo: nil, repeats: true)

你必须把它放在一个函数中,例如:

override func viewDidLoad() {
        super.viewDidLoad()
        var swiftTimer = NSTimer()
        swiftTimer = NSTimer.scheduledTimerWithTimeInterval(1, target:self, selector: Selector("sayHello"), userInfo: nil, repeats: true)
}

答案 1 :(得分:0)

self是指定义了方法(在类中定义的函数)的对象,因此只能在方法中使用。 (它相当于C ++ / Java / Javascript中的this。)在您的代码中,sayHello()是一个全局函数,而不是一个方法,因此没有self可以引用。

为了使scheduledTimerWithTimeInterval()函数调用能够使用这些参数,必须在实例方法中调用它,以便有self,并且该类必须具有名为{{1的方法}}

只要该对象具有sayHello()方法,您也可以将target:更改为其他对象。

答案 2 :(得分:0)

基本上,异步计时器在Playground中不起作用,因为Playground的顶层不是类,所以没有[ [2, {'id': 1, 'first_name': 'Jhon', 'last_name': 'Smith'}], [1, {'id': 2, 'first_name': 'Jeff', 'last_name': 'Levi'}], [1, {'id': 3, 'first_name': 'Jhon'}] ] 属性。

在游乐场中测试self

  • 在课堂上包装计时器。
  • 导入NSTimer
  • 添加XCPlaygound以启用对异步任务的支持。