类的Swift var类型

时间:2015-02-01 00:49:02

标签: swift

我有下一个示例,我在初始化变量tmpClass时遇到问题,我尝试了AnyAnyObjectAnyClass ...但没有成功。我需要从一个变量

动态更改并调用该类
class One{
  func doSomething()->Int{ return 100 } 
}

class Two{
  func doSomething()->Int{ return 200 }
}

class begin{

   var tmpClass = ???
   var type = "One"

   switch (type){

      case "One":
      tmpClass = One()

      case "Two":
      tmpClass = Two()
   }

   println(tmpClass.doSomething())

}

问题是需要什么类型tmpClass或某种方法呢?

1 个答案:

答案 0 :(得分:2)

你可以用两种不同的方式来做,看看哪种方式更适合你:

协议

doSomething

创建协议
protocol DoSomethingProtocol {
    func doSomething()->Int
}

让你的课程符合它

class One : DoSomethingProtocol {
    func doSomething()->Int{ return 100 }
}

class Two : DoSomethingProtocol{
    func doSomething()->Int{ return 200 }
}

将您的tempClass变量设置为符合协议的类

var tmpClass: DoSomethingProtocol?

继承

使用doSomething方法

创建基类
class DoSomethingBaseClass {
    func doSomething()->Int{ return 0 }
}

覆盖班级中的doSomething

class One : DoSomethingBaseClass {
    override func doSomething()->Int{ return 100 }
}

class Two : DoSomethingBaseClass{
    override func doSomething()->Int{ return 200 }
}

将您的tempClass变量设置为超类(多态!)

var tmpClass: DoSomethingBaseClass?

一般提示

  • 在Swift中switch必须是详尽无遗的(所有可能的选项必须有一个案例),要在您的示例中修复此问题,您只需添加

    default:
        tmpClass = nil
    
  • 不要忘记打开您的选购件。为安全起见,您可以使用if let语法进行可选绑定:

    if let tmpUnwrappedClass = tmpClass {
        println(tmpUnwrappedClass.doSomething())
    }

    您可以在!中使用println(tmpClass!.doSomething())展开式运算符,但tmpClass为零时将失败

  • 您的begin类有两个属性,没有初始值设定项。具有属性的类必须具有指定的初始化程序来设置它们,这就是我删除整个类的原因。

两个版本都经过测试,并使用Playground在最新的Swift中工作。