在我在viewDidLoad中声明它之后,似乎在“solve:”方法中无法识别常量“jumbleDictionary”。
这是为什么?我尝试在顶级代码中声明它,但我想调用Date()调用来测量加载NSDictionary所需的时间,并且遇到“期待声明”错误。
但是将它放在一个方法中似乎隐藏了其他方法的符号。我不记得这是Objective-C中的问题 - 我记得,类的所有属性都可以在所有方法中使用。
import Cocoa
class JumbleController: NSViewController {
@IBOutlet weak var scrambledWordField, solutionWordsField, elapsedTime: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
let jumbleDictionary: NSDictionary? = NSDictionary.init(contentsOfFile: Bundle.main.path(forResource: "BigDictionary", ofType: "plist")!)
}
@IBAction func solve(sender: NSTextField)
{
let timeStart = Date.init()
var userWordString = scrambledWordField.stringValue.lowercased()
if Range(4...15).contains(userWordString.characters.count) {
userWordString = String(Array(userWordString.characters).sorted())
if let solutionWordArray = (jumbleDictionary?[userWordString] as? [String]?)!
{
let timeEnd = Date.init()
solutionWordsField.stringValue = solutionWordArray.joined(separator: "\n").uppercased()
elapsedTime.doubleValue = timeEnd.timeIntervalSince(timeStart)
}
else {
solutionWordsField.stringValue = "No Solution Found."
}
}
else {
solutionWordsField.stringValue = "Must be 4 to 15 letters."
}
}
}
列出项目
答案 0 :(得分:2)
这是一个范围问题。在方法中声明变量时。它只对该方法可见。由于jumbleDictionary是在viewDidLoad()方法中定义的,因此它只在那里可用。
试试这个:
var jumbleDictionary: NSDictionary?
override func viewDidLoad() {
super.viewDidLoad()
jumbleDictionary = //whatever you want
}