Skip to content

Instantly share code, notes, and snippets.

@Vyazovoy
Created April 3, 2018 00:28
Show Gist options
  • Save Vyazovoy/00b0508973087368f7fd7a68a42209c1 to your computer and use it in GitHub Desktop.
Save Vyazovoy/00b0508973087368f7fd7a68a42209c1 to your computer and use it in GitHub Desktop.
Xcode 9.3 protocol conformance bug
//: Playground - noun: a place where people can play
import UIKit
protocol ViewControllerProvider {
func createViewController() -> UIViewController
}
protocol HasProvider {
associatedtype Provider: ViewControllerProvider
var provider: Provider! { get set }
}
protocol SpecialProvider {
associatedtype ViewController: UIViewController, HasProvider
}
extension SpecialProvider where ViewController.Provider == Self {
func createViewController() -> UIViewController {
var vc = ViewController.init()
vc.provider = self
return vc
}
}
class ConcreteViewController: UIViewController, HasProvider {
typealias Provider = ConcreteProvider
var provider: Provider!
}
class ConcreteProvider: SpecialProvider, ViewControllerProvider {
typealias ViewController = ConcreteViewController
}
let provider = ConcreteProvider()
let controller = provider.createViewController()
//Playground execution failed:
//
//error: Playground.playground:26:7: error: type 'ConcreteProvider' does not conform to protocol 'ViewControllerProvider'
//class ConcreteProvider: SpecialProvider, ViewControllerProvider {
// ^
//
// Playground.playground:14:10: note: candidate has non-matching type '<Self> () -> UIViewController'
// func createViewController() -> UIViewController {
//^
//
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment