import Foundation import UIKit //: # The problem: Protocol that is using an enum with generic associated type enum GenericEnum { case Unassociated case Associated(T) } protocol AssociatedProtocol: class { typealias Association func foo() -> GenericEnum } //: ## Short example of the issue //: Protocol can only be used as a generic constraint because it has associated type requirements let bar = [AssociatedProtocol]() //: ## Long example of the issue // working examples class StringProtocol: AssociatedProtocol { func foo() -> GenericEnum { // todo... return .Associated("foo") } } class StringListProtocol: AssociatedProtocol { func foo() -> GenericEnum<[String]> { // todo... return .Associated(["foo"]) } } let aStringListProtocol = StringListProtocol() let returnedEnum = aStringListProtocol.foo() switch returnedEnum { case .Unassociated: println("Unassociated") case .Associated(let strings): println("strings: \(strings)") } // not working class StringProtocolList: AssociatedProtocol { typealias StringProtocolArray = [AssociatedProtocol] var stringProtocols: StringProtocolArray = [] func foo() -> GenericEnum { let stringProtocol = StringProtocol() stringProtocols.append(stringProtocol) // todo... return .Associated(stringProtocols) } } let list = StringProtocolList() let foos = list.foo()