【问题标题】:Define typealias at runtime在运行时定义类型别名
【发布时间】:2015-07-07 09:39:17
【问题描述】:

有没有办法在运行时定义类型别名?

在我的测试代码中:

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 类型调用。

【问题讨论】:

  • 你需要用classType做什么?
  • 这样,不……你到底想做什么?
  • 看看更新..
  • 抱歉,我仍然不确定你要做什么!
  • 我更新了整个代码,也许更清楚..

标签: ios objective-c swift generics type-alias


【解决方案1】:

typealias 在运行时不可用。 但也许这会有所帮助,它是通过枚举和协议实现的。 在操场上试试

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")
    }
  }
}

【讨论】:

  • 我试着看看我是否可以在我的班级架构中采用它。顺便说一句,很好的提示,谢谢!我让你知道
猜你喜欢
  • 2018-04-21
  • 2012-03-04
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多