从未使用不可变值'rate'的初始化

时间:2018-07-24 23:59:30

标签: swift macos

我是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是我注释掉错误并运行代码后最终会发生的事情。我可以帮忙吗?

谢谢!

3 个答案:

答案 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的变量。