在Swift中设置特定变量

在Swift中设置特定变量,swift,inheritance,Swift,Inheritance,我正在使用Pitre的书《初学者的Swift代码》学习Swift代码。我对书中没有充分描述的一个陈述有一个问题 在制定如何设置简单应用程序时,作者首先创建一个名为SimpleInterest.swift的新目标文件,该文件包含以下语句: import Foundation class SimpleInterest{ func calculate(loanAmount:Double, var interestRate:Double,years:Int) -> Double{

我正在使用Pitre的书《初学者的Swift代码》学习Swift代码。我对书中没有充分描述的一个陈述有一个问题

在制定如何设置简单应用程序时,作者首先创建一个名为SimpleInterest.swift的新目标文件,该文件包含以下语句:

import Foundation

class SimpleInterest{
    func calculate(loanAmount:Double, var interestRate:Double,years:Int) -> Double{
        interestRate  = interestRate/100.00
        var interest = Double(years) * interestRate * loanAmount
        return loanAmount + interest
    }
}
然后,在主文件AppDelegate.swift中设置以下代码:

import Cocoa

@NSApplicationMain

class AppDelegate: NSObject, NSApplicationDelegate {
    @IBOutlet weak var window: NSWindow!  
    @IBOutlet weak var loanAmountField:NSTextField!
    @IBOutlet weak var interestRateField:NSTextField!
    @IBOutlet weak var yearsField:NSTextField!
    @IBOutlet weak var resultField:NSTextField!


    var simpleInterestCalculator:SimpleInterest  = SimpleInterest

    @IBAction func buttonClicked(sender:NSButton) {
        var result:Double
        result = simpleInterestCalculator.calculate(loanAmountField.doubleValue, 
                     interestRate:interestRateField.doubleValue,
                     years:yearsField.integerValue)

        self.resultField.stringValue = result.description
    }

}
我的问题在于这句话:

var simpleInterestCalculator:SimpleInterest  =  SimpleInterest()
我不知道为什么我们不能简单地说:

var simpleInterestCalculator  = SimpleInterest() 
因为SimpleInterest已经是包的一部分。我错过了什么

这是一种由以下代码表示的继承快捷方式:

AnotherSimpleInterestClass : SimpleInterest{
    var simpleInterestCalculator  = AnotherSimpleInterestClass()
}

没有;
运算符根据上下文具有不同的含义

您在最后提到的继承表示是一种类型;
表示当前类扩展的类

然而,在
var-simpleInterestCalculator:SimpleInterest=SimpleInterest
的情况下,它仅表示类型

也就是说,
simpleInterestCalculator
属于您在
SimpleInterest
类中定义的类型
SimpleInterest
;然后将构造
SimpleInterest
对象的结果分配给该变量

其他例子:

var testStr: String = "Test" // Type String
var testInt: Int = 5 // Type Int
var controller: UIViewController = UIViewController() // Type UIViewController

变量名后的冒号和类型显式定义对象实例的类类型。Swift能够从指定的值推断出这一点,因此从技术上讲,您是正确的,这是不必要的,但不是无效的

var myString:String = "my string"
完全一样

var myString = "my string"

你正在学习的这本书的作者只是喜欢更冗长的语法。编译器将推断出正确的类型,并消除对冗余变量类型声明的需要:尝试不使用显式类型,您会发现它没有任何区别

如果可能存在歧义,则在Swift中显式键入可能很有用。在这种情况下,没有这样的意图,因此可能是纯粹的教学

var thing: Thing = Thing() 
//is strictly equivalent to
var thing = Thing()

// but typing explicitly would make sense here:
var derivedThing: Thing = DerivedThing()
//if DerivedThing inherits from Thing, of course!

感谢所有回答这个问题的人。以下是我所能推断的:

  • 如果其他人正在使用Pitre的《初学者的Swift代码》一书,您将从Apple开发者文档中的“元类型”类型研究中得到帮助,链接如下:
  • 基本上,类型名称可以由类、结构、枚举或协议以及本书中讨论的内容组成。如果愿意,可以将类型指定添加到在多个章节中创建的任何类中

  • 关于上述问题:

    var simpleInterestCalculator:SimpleInterest  = SimpleInterest 
    
  • 相当于:

    var simpleInterestCalculator  = SimpleInterest
    
  • 本书未讨论此功能

  • 指定类型不仅仅是冗长;如果它没用,苹果就不会把它包括在内。通常,指定类型有助于防止出现令人讨厌的错误。我想你误读了我的答案。不要试图暗示显式类型是无用的,但在链接相同类型的var声明、类型和实例化的特定情况下,这是多余的,可能是教学上的。