public protocol Critter { associatedtype Fur } public protocol Pet {} public typealias Cat = Critter & Pet public protocol Kitten : Cat {} extension Kitten { public func pet() -> Fur { while true {} } } public final class Meow : Kitten { public typealias Fur = Purrs }