Я попытался создать протокол, который может быть реализован только по классам, которые наследуют от UIView
, что было мое удивление, когда этот код компилируется без ошибок (в Swift 3.0):Как создать ограничение по протоколу
protocol TestsProtocol {
func test()
}
extension TestsProtocol where Self: UIView { }
class FooClass: TestsProtocol {
func test() {
}
}
Мы может видеть, что FooClass
не наследуют от UIView
, используя расширение протокола. Я не хочу, чтобы только такие классы, которые наследуются от UIView
, могут его реализовать. Насколько я помню, это не скомпилировалось в Swift 2.1
Я не могу придумать причины, почему это не скомпилировалось в Swift 2.1 - расширения протокола не ограничивают, какие типы могут соответствовать протоколу, они просто позволяют добавлять стандартные реализации. Но реальный вопрос заключается в том, что тип * может * удовлетворять всем требованиям протокола, почему * не должен * разрешаться, если он не является «UIView»? – Hamish
Возможный дубликат [расширение, которое может применяться только к данному типу класса] (http://stackoverflow.com/questions/41349324/extension-that-can-only-be-applied-on-a-given-class- тип) - хотя я не верю, что ответ там дает * точно * то, что вы хотите. Ответ заключается просто в том, что вы не можете ограничивать соответствие протоколу на основе соответствующего типа. – Hamish