我是Swift和Xcode的新手,我正在尝试为Mac构建财务计算器,但遇到了两个问题。 第一个问题是在我的代码中,它说我初始化了一个值,但从未使用过它。我相信我确实已经做到了,但是我不断出错。这是我正在研究的班级的全部代码: 进口可可粉
class PresentValueController: NSViewController {
@IBOutlet weak var answer_label: NSTextField!
@IBOutlet weak var payment_field: NSTextField!
@IBOutlet weak var rate_field: NSTextField!
@IBOutlet weak var periods_field: NSTextField!
@IBOutlet weak var compounding_popup: NSPopUpButton!
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
}
@IBAction func popupValueChanged(_ sender: NSPopUpButton) {
let rate = (rate_field.integerValue)/sender.selectedTag()
return
}
@IBAction func calculate_button(_ sender: Any) {
let payment = (payment_field.integerValue)
let present_value = (payment / (1 + rate)^12)
answer_label.stringValue = "$\(present_value)"
}
}
如您所见,我已经定义了费率并尝试使用它,但是我不断收到错误消息。
我的下一个问题与美学有关。 This是我希望输出显示的样子,但是this是我注释掉错误并运行代码后最终会发生的事情。我可以帮忙吗?
谢谢!
答案 0 :(得分:0)
问题在这里
let rate = (rate_field.integerValue)/sender.selectedTag()
您不使用,您可能会认为它在其他方法中是可见的,但不是,也可以删除返回值
//
@IBAction func calculate_button(_ sender: Any) {
let rate = (rate_field.integerValue)/ popButton.selectedTag()
let payment = (payment_field.integerValue)
let present_value = (payment / (1 + rate)^12)
answer_label.stringValue = "$\(present_value)"
}
并声明
@IBOutlet weak var popButton: NSPopUpButton!
如果还没有
@IBOutlet weak var compounding_popup: NSPopUpButton!
答案 1 :(得分:0)
您的rate
变量是popupValueChanged(_:)
的本地变量,而您在rate
中对calculate_button(_:)
的引用是对未定义变量的引用。
您可以将rate
保存为PresentValueController
对象的实例变量,但是我建议您不要这样做,因为您将要复制数据,而且很容易随着应用程序复杂性的增长而变得不同步。
相反,我建议您只计算rate
函数中的calculate_button(_:)
,然后完全删除popupValueChanged(_:)
函数:
class PresentValueController: NSViewController {
@IBOutlet weak var answerLabel: NSTextField!
@IBOutlet weak var paymentField: NSTextField!
@IBOutlet weak var rateField: NSTextField!
@IBOutlet weak var periodsField: NSTextField!
@IBOutlet weak var compoundingPopup: NSPopUpButton!
@IBAction func calculateButton(_ sender: NSButton) {
let rate = rateField.integerValue / sender.selectedTag()
let payment = paymentField.doubleValue
let presentValue = payment / pow(1 + Double(rate), 12)
let formatter: NumberFormatter = {
let f = NumberFormatter()
f.locale = NSLocale.current
f.numberStyle = .currency
return f
}()
answerLabel.stringValue = formatter.string(from: NSNumber(value: presentValue))!
}
}
答案 2 :(得分:0)
您需要了解范围和局部变量的概念。
您在函数内部定义的变量(或let常数)仅存在于函数内部。 (对于这篇文章的其余部分,我将互换使用术语“变量”,“不可变变量”和“ let常量”,尽管有点草率。)
您的函数popupValueChanged()
创建一个仅在函数内部存在的 local 可变利率。退出函数后,您在函数内部定义的局部变量将超出范围并不再存在。
根据您发布的代码,我希望您的函数calculate_button()
遇到另一个有关未定义表达式rate
的错误。
考虑以下代码:
class AClass {
let rate = 3
func foo() {
let rate = 6
print("inside function, rate =", rate)
print("inside function, self.rate = ", self.rate)
}
}
let anObject = AClass()
anObject.foo()
print("outside function, anObject.rate = ", anObject.rate)
print("rate =", rate) //This will give an error.
(假装它已进入游乐场)
代码将执行以下操作:
创建AClass
的实例。 AClass
对象的初始化将创建一个值为3的不可变实例变量rate
。
然后我们调用AClass
对象的foo()
方法,该方法定义了一个不同的 local 变量,也称为rate
,并为该变量分配了值6局部变量。
该代码的输出将为
inside function, rate = 6
inside function, anObject.rate = 3
outside function, anObject.rate = 3
在函数内部,局部变量rate
隐藏了 instance 变量速率,因此在函数内部引用rate
表示局部不变变量。由于在不同的范围内定义了两个名为rate
的变量,因此我们必须使用self.rate
来引用函数内的 instance 变量rate
。>
在foo()
函数之外,该函数的局部变量rate
不再存在,因此rate
引用了 instance 变量速率,其值一直为3。
该行:
print("rate =", rate) //This will give an error.
将给出编译错误,因为该函数之外在该作用域中没有名称为rate
的变量。