我有下一个示例,我在初始化变量tmpClass
时遇到问题,我尝试了Any
,AnyObject
,AnyClass
...但没有成功。我需要从一个变量
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
或某种方法呢?
答案 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中工作。