Swift继承了类

时间:2014-08-31 05:46:25

标签: class inheritance swift

下面的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))
        }
    }

2 个答案:

答案 0 :(得分:1)

如果您发起变量,taskMgrtaskMgr: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的值。编译器可以自动计算出类型。

当你需要的类型不同于编译器从你给它的初始值推断的类型时,你实际上只需要指定一个类型。例如,如果需要使变量可选,或者您需要将变量作为要分配的值的超类的类型。