0

I have a class with a delegate of type UIViewController

This delegate can be one of 2 subclasses of UIViewController. Both subclasses contain a method with the same name taking the same arguments.

class TypeOne: UIViewController {
    method() {

    }
}

class TypeTwo: UIViewController {
    method() {

    }
}

Currently I'm writing the statement like this and of course it works, but it's driving me batty from a DRY standpoint.

if let delegate = delegate as? TypeOne {
    delegate.method()
} else if let delegate = delegate as? TypeTwo {
    delegate.method()
}

I want to do something like

if let delegate = delegate as? TypeOne ?? delegate as TypeTwo {
    delegate.method()
}

But the above doesn't actually downcast the delegate, as I get an error that type UIViewController doesn't contain 'method'

How else can I chain this so if the first downcast fails, the second one is tried and the delegate is treated as either type rather than a base UIViewController?

froggomad
  • 1,747
  • 2
  • 17
  • 40

1 Answers1

2

You are describing a protocol:

protocol MethodHolder {
    func method()
}
class TypeOne: UIViewController, MethodHolder {
    func method() {
    }
}
class TypeTwo: UIViewController, MethodHolder {
    func method() {
    }
}
class ActualViewController : UIViewController {
    var delegate : MethodHolder?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate?.method() // no need to cast anything!
    }
}

There is no need to cast anything, because typing the delegate as a MethodHolder guarantees to the compiler (and to you) that this object has a method method. Thus you can call that method without bothering to know whether this happens to be a TypeOne or a TypeTwo.

matt
  • 515,959
  • 87
  • 875
  • 1,141