Как переопределить и унаследовать расширение в Swift?

Я новичок в разработке iOS и читал статьи о расширении. Но я не смог найти примеров расширения и наследования от расширения.

В качестве примера возьмем SpreadsheetView. Я хочу переопределить расширение SpreadsheetView.

Я обнаружил, что могу переопределить его, создав другое расширение в своем собственном файле .swift:

extension SpreadsheetView {
    public func scrollViewDidScroll(_ scrollView: UIScrollView) {
    // custom code
    }
}

Однако я также хочу сохранить реализацию по умолчанию. Как я могу вызвать его из своей пользовательской функции? super.scrollViewDidScroll или (self as SpreadsheetView).scrollViewDidScroll не работает.

и когда я вернусь к основному и скопирую весь код. Это не позволяло. Так что мне не вариант:

«rowHeaderView» недоступен из-за «внутреннего» уровня защиты


person Qooe    schedule 16.07.2017    source источник


Ответы (1)


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

Если вы хотите переопределить какую-либо функцию, вы должны переопределить класс, а затем переопределить метод. Что-то вроде этого.

class MySpreadsheetView: SpreadsheetView {
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        super.scrollViewDidScroll(scrollView)
        //....
    }
}
person Bilal    schedule 16.07.2017
comment
Я пробовал это раньше, и я получил ошибку Cannot inherit from non-open class 'SpreadsheetView' outside of its defining module. Означает ли это, что я не могу создать подкласс этой библиотеки? и должны изменить библиотеку напрямую? - person Qooe; 16.07.2017
comment
В классе Swift должен быть open, если вы не хотите, чтобы он переопределялся вне модуля. SpreadsheetView должен быть общедоступным или закрытым, чтобы вы не могли переопределить его вне модуля. - person Bilal; 16.07.2017
comment
Спасибо. Означает ли это, что изменение исходного кода модуля — единственный способ? или любой другой элегантный способ справиться с этой причиной? (Поэтому, если это закрытый исходный код, вы не можете изменить его напрямую) - person Qooe; 16.07.2017
comment
Я думаю, это единственный вариант. Вы можете разветвить репозиторий GitHub и изменить исходный код. И если вы используете какао-бобы, вы можете указать SpreadsheetView на эту ветку. - person Bilal; 16.07.2017
comment
это работает: extension UITableView { переопределить open func scrollRectToVisible (_ rect: CGRect, анимированный: Bool) { print (прокрутить до видимого) } }, так что это возможно, НО оно переопределяет его для всего проекта... что на самом деле не то, что вы хотите тем не мение. Просто знайте, что это можно переопределить через расширение. - person Mikael; 10.06.2019