有没有办法在运行时定义类型别名?
在我的测试代码中我有:
typealias classType = A
switch i {
case 0: typealias classType = B
case 1: typealias classType = C
case 2: typealias classType = D
default:typealias classType = E
}
但 classType 仍然是 A“类型”..
艺术现状:
class E {}
class A: E {}
class B: E {}
class C: E {}
class D: E {}
class Service {
func retrieve<T>(completion: (response: ResponseItems<T>?, error: NSError?) -> Void) {}
}
因此,在代码的通用部分:
let service = Service()
typealias classType = A
switch i {
case 0: typealias classType = B
case 1: typealias classType = C
case 2: typealias classType = D
default:typealias classType = E
}
service.retrieve{ (response: ResponseItems<classType>?, error) -> Void in
}
这有效,但总是使用 A 类型调用。
最佳答案
typealias
在运行时不可用。
但这也许有帮助,它是通过枚举和协议(protocol)实现的。
在 Playground 上试试
enum ClassType {
case ClassAType, ClassBType, ClassCType
}
protocol ResponseItem {
var getType : ClassType { get }
}
class ClassA: ResponseItem
{
var getType : ClassType { return .ClassAType }
}
class ClassB: ResponseItem
{
var getType : ClassType { return .ClassBType }
}
class ClassC: ResponseItem
{
var getType : ClassType { return .ClassCType }
}
func retrieve( response : ((ResponseItem?, NSError?) -> Void))
{
let aType = ClassB()
response(aType, nil)
}
retrieve{ (response: ResponseItem?, error) -> Void in
if let classType = response {
switch classType.getType {
case .ClassAType:
println("ClassA")
case .ClassBType:
println("ClassB")
case .ClassCType:
println("ClassC")
}
}
}
关于ios - 在运行时定义类型别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31265008/