Как вызвать функцию протокола по умолчанию, объявленную в расширении протокола? - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь вызвать функцию протокола по умолчанию, которая была объявлена ​​в расширении:

protocol Tester {
    func printTest()
    }

extension Tester {
    func printTest() {
        print("XXXXTestXXXX")
    }
}

class TestController: UIViewController, Tester {

 let testing = Tester()// error here

    override func viewDidLoad() {
        super.viewDidLoad()

        testing.printTest()
    }

}

Ошибка '' Tester 'не может быть создана, потому что у него нет доступных инициализаторов', продолжает появляться, когда я пытаюсь создать экземпляр протокола. Каков наилучший способ использования функций по умолчанию в протоколах?

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Протоколы не могут быть созданы - когда-либо - давайте думать о них Контракты

Классы МОГУТ совпадать с протоколами 1..n.


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

очень дешевый способ в вашем случае будет:

let testing = self

, поскольку ваш класс TestController уже соответствует Tester. (Обратите внимание, я создаю цикл сохранения)

===

другим способом было бы не использовать тестирование, но self.printTest() (Это может быть то, что вы хотите)

  • Я перечитал бы книгу Apple Swift и проверил протоколы (что они и как они работают)
0 голосов
/ 28 июня 2018
protocol Proto { 
    // func testPrint() <- comment this out or remove it
}

extension Proto {
    func testPrint() {
        print("This extension called")
    }
}

struct Bar: Proto {
    func testPrint() {
        print("Call from Structure")
        (self as Foo).testPrint() 
    }
}

Bar().testPrint()

// Output:   'Call from Structure',
//            'This extension call'
0 голосов
/ 28 июня 2018

Вы должны вызвать реализатор, в вашем случае это TestController так:

self.printTest() будет работать

...