Как определить переменную функцию и вызвать ее из файла расширения в Swift? - PullRequest
0 голосов
/ 29 февраля 2020

Я создал файл SWIFT расширения и в этом файле я написал расширение UIViewController {...} в своем проекте, вместо того, чтобы записывать все строки в каждом контроллере представления. Все работало нормально Позже я создал publi c fun c (то есть myFun c) с одинаковым именем внутри каждого из 30 контроллеров представления и с различными выходами . Я пытаюсь вызвать эту общую именованную функцию из файла расширения, но я получаю сообщение об ошибке "Значение типа 'UIViewController' не имеет члена 'myFun c'. В файле расширения, как я могу вызвать эту общую именованную функцию, которая выполняет разные выходы на каждом контроллере вида?

Код файла расширения:

extension UIViewController {
    func sampleFunc {
        let viewController = self.navigationController?.visibleViewController {
        ........
        viewController.myFunc() }.    *//error: Value of type 'UIViewController?' has no member 'myFunc'*
    }
}

Примечание: я не хочу использовать вот так:

if let viewController = self as? ViewController1 {viewController.myFunc()}
if let viewController = self as? ViewController2 {viewController.myFunc()}
if let ... 3,
4....30

Или может быть, есть ли способ проверить, существует ли функция, и если она существует, выполнить команду без получения ошибок такого рода?

использование неразрешенного идентификатора

или

значение типа 'UIViewController?' У меня нет участника 'myFun c'

Ответы [ 2 ]

4 голосов
/ 29 февраля 2020

Переменная viewController в расширении может быть любой V C, не так ли? Не только 30, которые вы создали. Вы не можете гарантировать, что любой случайный V C будет иметь метод с именем myFunc, поэтому вы не можете вызывать его в расширении.

Одним из способов решения этой проблемы является создание протокола, который все ваши 30 VC реализуют:

protocol MyFuncable : UIViewController { // please come up with a better name
    func myFunc ()
}

Это пример того, как вы реализуете протокол:

class ViewController: UIViewController, MyFuncable { 
    func myFunc() { 
        // do whatever you want...
        print("myFunc executed")
    }
}

Теперь мы гарантируем, что все, что реализует myFuncable, будет иметь метод с именем myFunc, поэтому теперь в вашем расширении вы можете проверить, являются ли VC MyFuncable:

extension UIViewController {
    func sampleFunc() {
        // here is where the checking happens:
        if let viewController = self.navigationController?.visibleViewController as? MyFuncable {
            viewController.myFunc() 
        }
    }
}
0 голосов
/ 29 февраля 2020

Попробуйте этот код ниже.

extension UIViewController {
    func sampleFunc() {
        if let viewController = self.navigationController?.visibleViewController {
            print("Class name: \(NSStringFromClass(type(of: viewController)))")
            let anyObject = viewController as AnyObject
            if anyObject.responds(to: #selector(anyObject.myFunc)) {
                anyObject.myFunc()
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...