title: Using some protocol as a concrete type conforming to another protocol is not supported
body: <p>I’m trying to mix generics with protocols and I’m getting a really hard time xD</p>
  
  <p>I have certain architecture implemented in an Android/Java project, and I’m trying to rewrite it to fit it in a swift/iOS project. But I’ve found this limitation.</p>
  
  <p><strong>ProtocolA</strong></p>
  
  <pre><code>protocol ProtocolA {
  
  }
  </code></pre>
  
  <p><strong>ProtocolB</strong></p>
  
  <pre><code>protocol ProtocolB : ProtocolA {
  
  }
  </code></pre>
  
  <p><strong>ImplementProtocolA</strong></p>
  
  <pre><code>class ImplementProtocolA &lt;P : ProtocolA&gt; {
  
      let currentProtocol : P
  
      init(currentProtocol : P) {
          self.currentProtocol = currentProtocol
      }
  
  }
  </code></pre>
  
  <p><strong>ImplementProtocolB</strong></p>
  
  <pre><code>class ImplementProtocolB : ImplementProtocolA&lt;ProtocolB&gt; {
  
  }
  </code></pre>
  
  <p>So, when I try to set <em>ProtocolB</em> as the concrete type that implements <em>ProtocolA</em>, I get this error:</p>
  
  <p><strong><em>Using 'ProtocolB' as a concrete type conforming to protocol 'ProtocolA' is not supported</em></strong></p>
  
  <p>1 Is there any reason for this “limitation”?</p>
  
  <p>2 Is there any workaround to get this implemented?</p>
  
  <p>3 Will it be supported at some point?</p>
  
  <p><strong>--UPDATED--</strong></p>
  
  <p><em>Another variant of the same problem, I think:</em> </p>
  
  <p><strong>View protocols</strong></p>
  
  <pre><code>protocol View {
  
  }
  
  protocol GetUserView : View {
      func showProgress()
      func hideProgress()
      func showError(message:String)
      func showUser(userDemo:UserDemo)
  }
  </code></pre>
  
  <p><strong>Presenter protocols</strong></p>
  
  <pre><code>protocol Presenter {
      typealias V : View
  }
  
  class UserDemoPresenter : Presenter {
      typealias V = GetUserView
  }
  </code></pre>
  
  <p><strong><em>Error:</em></strong> </p>
  
  <blockquote>
    <p>UserDemoPresenter.swift Possibly intended match 'V' (aka
    'GetUserView') does not conform to 'View’</p>
  </blockquote>
  
  <p>What is that?? It conforms!</p>
  
  <p>Even if I use View instead of GetUserView, it does not compile.</p>
  
  <pre><code>class UserDemoPresenter : Presenter {
      typealias V = View
  }
  </code></pre>
  
  <blockquote>
    <p>UserDemoPresenter.swift Possibly intended match 'V' (aka 'View') does
    not conform to 'View' </p>
  </blockquote>
  
  <p>xxDD I don’t get it, really.  </p>
  
  <p><strong>--UPDATED--</strong></p>
  
  <p>With the solution proposed by Rob Napier the problem is not fixed, instead, it is just delayed.</p>
  
  <p>When a try to define a reference to UserDemoPresenter, I need to specify the generic type, so I get the same error:</p>
  
  <pre><code>private var presenter : UserDemoPresenter&lt;GetUserView&gt;
  </code></pre>
  
  <blockquote>
    <p>Using 'GetUserView' as a concrete type conforming to protocol
    'GetUserView' is not supported</p>
  </blockquote>