下面的var声明了什么(在Swift中)
var taskMgr = TaskManager()
和
var taskMgr:TaskManager = TaskManager()
到目前为止,它已编译并正常工作。
import UIKit
var taskMgr = TaskManager()
struct task{
var name = "Un-Named"
var desc = "Un-Desc"
}
// Inherited class from NSObject
class TaskManager: NSObject {
var tasks = [task]()
func addTask(name: String, desc: String){
tasks.append(task(name: name, desc: desc))
}
}
答案 0 :(得分:1)
如果您发起变量,taskMgr
和taskMgr:TaskManager
之间没有区别。 Swift编译器应该知道taskMgr
类型。
但是,如果定义可选变量,则必须告诉编译器您期望的类型。例如:
var taskMgr:TaskManager?
或者,如果您想要强制类型定义来覆盖默认类型。例如,使用继承的类。请考虑以下事项:
class ParentClass: NSObject {
func parentFoo() ->String{
return "I'm parent method"
}
}
class ChildClass: ParentClass {
func childFoo() ->String{
return "I'm child method"
}
}
var child = ChildClass() // child has type of ChildClass
println(child.childFoo()) // out: "I'm child method"
println(child.parentFoo())// out: "I'm parent method"
var parentOnly:ParentClass = ChildClass() // <-- force type
println(parentOnly.childFoo()) // ERROR: ParentClass does not have childFoo() method
println(parentOnly.parentFoo()) // out: "I'm parent method"
答案 1 :(得分:1)
两个版本都做了完全相同的事情。要理解这一点,您必须了解Swift有一个名为Type Inference的功能。这意味着编译器可以根据给定的初始值计算出变量的类型。
您声明的第二个版本是完整且有意的版本:
var taskMgr:TaskManager = TaskManager()
通过这种方式,您将创建一个TaskManager
类型的变量,并为其分配一个新的任务管理器。
第一个版本是使用Type Inference的较短版本:
var taskMgr = TaskManager()
有了这个,你没有明确地给taskMgr
一个类型。您不需要声明类型,因为您已将其分配给类型TaskManager
的值。编译器可以自动计算出类型。
当你需要的类型不同于编译器从你给它的初始值推断的类型时,你实际上只需要指定一个类型。例如,如果需要使变量可选,或者您需要将变量作为要分配的值的超类的类型。