在最近更新到Xcode 8.3之前,我的代码正在按预期方式运行和运行。现在,我的代码无法运行,并出现以下错误:“类型GameScene没有成员:updateCounting”。我已经阅读了类似的问题和解决方案,但没有一个能够帮助解决该问题。我仍在学习迅速,因此将不胜感激。

这是我的代码:

    let highScoreDefault = UserDefaults.standard
    highScore = highScoreDefault.integer(forKey: "Highscore")
    highScoreLabel.text = "\(highScore)"

func scoreUpdate(_ currentTime: CFTimeInterval){

    if (score > highScore) {
        highScore = score
        highScoreLabel.text = NSString(format: "Highscore : %i", highScore) as String

        let highscoreDefault = UserDefaults.standard
        highscoreDefault.setValue(highScore, forKey: "Highscore")
        highscoreDefault.synchronize()

    }

    }

func updateCounting() {
        scoreLabel.text = String(self.score)
        finalScore.text = String(self.score)

        let highScoreDefault = UserDefaults.standard
        highScore = highScoreDefault.integer(forKey: " ")
        highScoreLabel.text = "\(highScore)"

    if (score > highScore) {
        highScore = score
        highScoreLabel.text = NSString(format: " %i", highScore) as String

        let highscoreDefault = UserDefaults.standard
        highscoreDefault.setValue(highScore, forKey: " ")
        highscoreDefault.synchronize()
    }

        self.score += 1
        print(score, terminator: " ")

    }

        timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(GameScene.updateCounting), userInfo: nil, repeats: true)

         // The above line of code is what's giving the error

        totalCoins = UserDefaults.standard.integer(forKey: "Total Coins")
        totalCoinLabel.text = "\(totalCoins)"

最佳答案

建议的解决方案

尝试在函数名称之前添加@objc,如下所示:

@objc func updateCounting() {
    // function code here
}


然后使用#selector(self.updateCounting)

工作实例

我接受了您的代码,并对其进行了大幅简化。我从一个新的Single View项目开始。我添加了GameScene.swift文件并修改了ViewController类。请参见下面的代码。运行项目,您将看到日志显示:

Updating count: 0
Updating count: 1
Updating count: 2
Updating count: 3


GameScene.swift

import Foundation

class GameScene {
    var timer: Timer = Timer()
    var counter: Int = 0

    @objc func updateCounting(){
        print("Updating count: \(counter)")
        counter += 1
    }

    func updateTimer() {
        timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(updateCounting), userInfo: nil, repeats: true)
    }
}


ViewController.swift

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let game = GameScene()
        game.updateTimer()
    }
}


Github链接:https://github.com/starkindustries/TimerTestProject

有效的语法选项

以下选项在此示例项目中成功测试:


selector: #selector(updateCounting)
selector: #selector(self.updateCounting)
selector: #selector(GameScene.updateCounting)


假设您要向updateCounting函数添加参数。将您的updateCounting方法名称更改为@objc func updateCounting(_ timer: Timer),并将选择器更改为selector: #selector(updateCounting(_:)

语法讨论

一旦删除@objc,编译器就会显示此错误:


  “ #selector”的参数引用实例方法“ updateCounting”
  没有暴露于Objective-C


另一个答案中的评论之一也暗示了这一点:


  我需要添加编写目标函数,如下所示:@objc func
  更新时间() {}
  Timer.scheduledTimer swift 3 pre iOS 10 compatibility


苹果文档指出:


  选择器应具有以下签名:timer.fire方法:
  (包括表示该方法采用参数的冒号)。的
  计时器将自身作为参数传递,因此该方法将采用
  以下模式:
  -(void)timerFireMethod:(NSTimer *)timer https://developer.apple.com/reference/foundation/timer/1412416-scheduledtimer


即使我在文档的Swift版本中,它也显示了TimerFireMethod的Objective C版本。因此,也许Timer类期望使用Objective C选择器,就像抱怨的编译器错误一样。但是,文档指出该方法应该具有一个参数(计时器),但是我只是使用没有参数的函数成功地对其进行了测试。

关于ios - 刚升级到Xcode 8.3,现在出现错误:“Type GameScene没有成员:updateCounting”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43151262/

10-10 17:03