Nested types inside a protocol

LettersBa picture LettersBa · Aug 6, 2015 · Viewed 11.8k times · Source

It is possible to have nested types declared inside protocols, like this:

protocol Nested {

    class NameOfClass {
        var property: String { get set }
    }
}

Xcode says "Type not allowed here":

Type 'NameOfClass' cannot be nested in protocol 'Nested'

I want to create a protocol that needs to have a nested type. Is this not possible or I can do this in another other way?

Answer

ughoavgfhw picture ughoavgfhw · Aug 6, 2015

A protocol cannot require a nested type, but it can require an associated type that conforms to another protocol. An implementation could use either a nested type or a type alias to meet this requirement.

protocol Inner {
    var property: String { get set }
}
protocol Outer {
    associatedtype Nested: Inner
}

class MyClass: Outer {
    struct Nested: Inner {
        var property: String = ""
    }
}

struct NotNested: Inner {
    var property: String = ""
}
class MyOtherClass: Outer {
    typealias Nested = NotNested
}