先声明,后沮丧
Declaring first, downcasting later
假设我有 BaseClass
、DerivedClassOne
、DerivedClassTwo
、一个神奇的工厂方法 giveMeAnObjectOfType(type: String) -> BaseClass
和以下代码
func myBeautifulFunction(index: Int) -> BaseClass {
let type : String = self.someArray[index]
var anObject : BaseClass
switch type {
case "TypeOne":
// This won't work
anObject = self.giveMeAnObjectOfType("DerivedClassOne") as! DerivedClassOne
anObject.methodOfDCOne()
case "TypeTwo":
// Neither will this
anObject = self.giveMeAnObjectOfType("DerivedClassTwo") as! DerivedClassTwo
anObject.methodOfDCTwo()
default:
// Throw a tantrum here
}
return anObject
}
这将导致错误提示 anObject 不包含 methodOfDCOne()
或 methodOfDCTwo()
。问题:如何正确投射对象?
基本上,我可以通过在 switch 的案例中使用多个 return 语句来实现相同的目的,但我不喜欢它的外观。另外,如果我想调用BaseClass
的一些方法,我就会有很多重复的代码。
anObject.methodOfDCOne()
不编译因为methodOfDCOne
不是实例方法
BaseClass
(或其超classes)。
你必须先创建subclass类型的对象,这样你才能调用subclass方法。然后将对象分配(向上转换)到基 class
变量:
func myBeautifulFunction(index: Int) -> BaseClass {
let type : String = self.someArray[index]
let anObject : BaseClass
switch type {
case "TypeOne":
let dc1 = self.giveMeAnObjectOfType("DerivedClassOne") as! DerivedClassOne
dc1.methodOfDCOne()
anObject = dc1
case "TypeTwo":
let dc2 = self.giveMeAnObjectOfType("DerivedClassTwo") as! DerivedClassTwo
dc2.methodOfDCTwo()
anObject = dc2
default:
// Throw a tantrum here
fatalError("Unexpected type")
}
return anObject
}
假设我有 BaseClass
、DerivedClassOne
、DerivedClassTwo
、一个神奇的工厂方法 giveMeAnObjectOfType(type: String) -> BaseClass
和以下代码
func myBeautifulFunction(index: Int) -> BaseClass {
let type : String = self.someArray[index]
var anObject : BaseClass
switch type {
case "TypeOne":
// This won't work
anObject = self.giveMeAnObjectOfType("DerivedClassOne") as! DerivedClassOne
anObject.methodOfDCOne()
case "TypeTwo":
// Neither will this
anObject = self.giveMeAnObjectOfType("DerivedClassTwo") as! DerivedClassTwo
anObject.methodOfDCTwo()
default:
// Throw a tantrum here
}
return anObject
}
这将导致错误提示 anObject 不包含 methodOfDCOne()
或 methodOfDCTwo()
。问题:如何正确投射对象?
基本上,我可以通过在 switch 的案例中使用多个 return 语句来实现相同的目的,但我不喜欢它的外观。另外,如果我想调用BaseClass
的一些方法,我就会有很多重复的代码。
anObject.methodOfDCOne()
不编译因为methodOfDCOne
不是实例方法
BaseClass
(或其超classes)。
你必须先创建subclass类型的对象,这样你才能调用subclass方法。然后将对象分配(向上转换)到基 class 变量:
func myBeautifulFunction(index: Int) -> BaseClass {
let type : String = self.someArray[index]
let anObject : BaseClass
switch type {
case "TypeOne":
let dc1 = self.giveMeAnObjectOfType("DerivedClassOne") as! DerivedClassOne
dc1.methodOfDCOne()
anObject = dc1
case "TypeTwo":
let dc2 = self.giveMeAnObjectOfType("DerivedClassTwo") as! DerivedClassTwo
dc2.methodOfDCTwo()
anObject = dc2
default:
// Throw a tantrum here
fatalError("Unexpected type")
}
return anObject
}