2017-02-08 32 views
0

Я попытался создать протокол, который может быть реализован только по классам, которые наследуют от UIView, что было мое удивление, когда этот код компилируется без ошибок (в Swift 3.0):Как создать ограничение по протоколу

protocol TestsProtocol { 
    func test() 
} 

extension TestsProtocol where Self: UIView { } 

class FooClass: TestsProtocol { 

    func test() { 

    } 
} 

Мы может видеть, что FooClass не наследуют от UIView, используя расширение протокола. Я не хочу, чтобы только такие классы, которые наследуются от UIView, могут его реализовать. Насколько я помню, это не скомпилировалось в Swift 2.1

+0

Я не могу придумать причины, почему это не скомпилировалось в Swift 2.1 - расширения протокола не ограничивают, какие типы могут соответствовать протоколу, они просто позволяют добавлять стандартные реализации. Но реальный вопрос заключается в том, что тип * может * удовлетворять всем требованиям протокола, почему * не должен * разрешаться, если он не является «UIView»? – Hamish

+0

Возможный дубликат [расширение, которое может применяться только к данному типу класса] (http://stackoverflow.com/questions/41349324/extension-that-can-only-be-applied-on-a-given-class- тип) - хотя я не верю, что ответ там дает * точно * то, что вы хотите. Ответ заключается просто в том, что вы не можете ограничивать соответствие протоколу на основе соответствующего типа. – Hamish

ответ

2

Вы не можете сделать это в Swift. Синтаксис расширения делает что-то другое:

extension TestsProtocol where Self: UIView { 
    func useful() { 
     // do something useful 
    } 
} 

теперь любой класс, который реализует TestsProtocol и является UIView (или подкласс) также имеет функцию полезной().

 Смежные вопросы

  • Нет связанных вопросов^_^