Расширение вложенного типа в Swift - программирование

Расширение вложенного типа в Swift

У меня есть основной класс, также предоставляющий пространство имен:

class A {
}

и вложенный класс добавляется через расширение (все для использования отдельных файлов):

extension A {
  class B {
  }
}

Я хочу добавить функциональность к вложенному классу (B), расширив его; Я пробовал:

extension A.B {
}

Я получаю "B" не является типом члена "A".

(Я также пробовал некоторые менее разумные вещи, но я буду опускать их здесь, чтобы избежать смущения. Чтение Swift docs и Googling для "быстрого вложенного расширения класса" также не дало ответа.)

Любая идея, если и как это можно сделать?


UPDATE:

Этот код работает так, как ожидалось, когда в одном файле (или на игровой площадке), благодаря пользователю3441734 для его проверки!

Все еще не работает, когда 3 части находятся в отдельных файлах, возможно, ошибка в текущей реализации компилятора Swift. Я отправлю отчет об ошибке Apple.

4b9b3361

Ответ 1

Кажется, эта проблема связана с SR-631. Я сталкивался с подобной проблемой, я думаю, компилятор пытается обработать файл, в котором вы расширяете вложенный класс, перед тем, где он определен. Поэтому у вас есть эта ошибка, говорящая, что у A нет члена B.

Решение, которое я нашел, состоит в том, чтобы перейти к настройкам цели, открыть Build Phases.

enter image description here

Там, в разделе " Compile Sources ", вы должны поместить файл, в котором вы определяете вложенный класс, выше файлов, где вы его расширяете.

Обновить

Исправление будет поставляться с Xcode 10.2

Ответ 2

это работает на моей игровой площадке, как и ожидалось

class A {
}
extension A {
    class B {
    }
}
extension A.B {
    func foo() {
        print("print from extension A.B")
    }
}
let ab = A.B()
ab.foo()    // print from extension A.B