【发布时间】:2021-06-06 20:25:20
【问题描述】:
因为 Swift 是我的第一门编程语言,而且我也没有 Objective C 的经验...... 我很难理解 @objc 与方法的关系。
如何使用@objc 语法来符合我的方法? 有没有另一种不使用#selector 语法来选择方法的方法?
这是我遇到困难的代码(主要是 @objc 在 startGame 方法中的尝试):
import UIKit
@objc class ViewController: UITableViewController {
var allWords = [String]()
var usedWords = [String]()
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem =
UIBarButtonItem(barButtonSystemItem: .add, target: self, action:
#selector(promptForAnswer))
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "New
Word", style: .plain, target: self, action: #selector(startGame))
if let startWordsURL = Bundle.main.url(forResource: "start",
withExtension: "txt") {
if let startWords = try? String(contentsOf: startWordsURL) {
allWords = startWords.components(separatedBy: "\n")
}
}
if allWords.isEmpty {
allWords = ["silkworm"]
}
@objc func startGame() {
title = allWords.randomElement()
usedWords.removeAll(keepingCapacity: true)
tableView.reloadData()
{
startGame()
}
【问题讨论】:
-
你在这里省略了很多重要信息(或者我假设你是)。
startGame需要与您的其他函数在同一级别定义 - 您当前的代码使其看起来好像嵌套在 inside 另一个函数中。如果是这样,那是你的问题。如果不是这种情况,请将代码显示为真实代码中的结构。 -
是的,我确实省略了很多信息。我更新了代码。我不认为我的方法嵌套在这里。让我知道我是否应该包含更多代码。谢谢!!
-
在我看来,
func startGame()仍然是 insideviewDidLoad。它必须是与viewDidLoad处于同一级别的自己的函数——不在其内部。 -
在
["silkworm"]和@objc之间应该是两个}}而不是一个}
标签: objective-c swift function methods