Luca Davanzo
Luca Davanzo

Reputation: 21520

Define typealias at runtime

Is there a way to define a typealias at runtime?

In my test code I have:

typealias classType = A
switch i {
case 0: typealias classType = B
case 1: typealias classType = C
case 2: typealias classType = D
default:typealias classType = E
}

But classType still be of A "type"..

State of art:

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

so, in a generic part of code:

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

}

This works but is always called with A type.

Upvotes: 1

Views: 576

Answers (1)

vadian
vadian

Reputation: 285069

typealias is not useable at runtime. But maybe this helps, it's realized with an enum and protocol. Try it in a 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")
    }
  }
}

Upvotes: 1

Related Questions