Расширение вложенного типа в Swift
У меня есть основной класс, также предоставляющий пространство имен:
class A {
}
и вложенный класс добавляется через расширение (все для использования отдельных файлов):
extension A {
class B {
}
}
Я хочу добавить функциональность к вложенному классу (B), расширив его; Я пробовал:
extension A.B {
}
Я получаю "B" не является типом члена "A".
(Я также пробовал некоторые менее разумные вещи, но я буду опускать их здесь, чтобы избежать смущения. Чтение Swift docs и Googling для "быстрого вложенного расширения класса" также не дало ответа.)
Любая идея, если и как это можно сделать?
UPDATE:
Этот код работает так, как ожидалось, когда в одном файле (или на игровой площадке), благодаря пользователю3441734 для его проверки!
Все еще не работает, когда 3 части находятся в отдельных файлах, возможно, ошибка в текущей реализации компилятора Swift. Я отправлю отчет об ошибке Apple.
Ответы
Ответ 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