Ios 迅捷5。协议扩展引发编译错误';无法使用Self';类型的参数列表调用函数;
我想实现某种Ios 迅捷5。协议扩展引发编译错误';无法使用Self';类型的参数列表调用函数;,ios,swift,xcode,swift-protocols,associated-types,Ios,Swift,Xcode,Swift Protocols,Associated Types,我想实现某种Decorator模式,它允许编写可重用的Decorator 所以我定义了两个协议。第一个定义了装饰器的类型: 协议视图装饰器{ associatedtype视图:可装饰 func装饰(视图:视图) } //这就是我希望使用decorator的方式 类GreenViewDecorator:ViewDecorator{ typealias视图=绿色视图 func装饰(视图:绿色视图){ view.backgroundColor=UIColor.green } } 第二个定义了可装饰的
Decorator
模式,它允许编写可重用的Decorator
所以我定义了两个协议。第一个定义了装饰器的类型:
协议视图装饰器{
associatedtype视图:可装饰
func装饰(视图:视图)
}
//这就是我希望使用decorator的方式
类GreenViewDecorator:ViewDecorator{
typealias视图=绿色视图
func装饰(视图:绿色视图){
view.backgroundColor=UIColor.green
}
}
第二个定义了可装饰的视图应该符合的类型
协议可修饰{
func装饰(带装饰器:T)
}
扩展可装饰,其中Self:UIView{
func装饰(带装饰器:T){
decorator.decoration(视图:self)
}
}
//“可装饰”视图示例
类GreenView:UIView,可装饰{}
我在协议扩展中定义了函数func decoration(带decorator:T)
的默认实现。如果我的视图在默认情况下实现该方法,我认为这很有用。我只需要它继承可装饰的
协议。然后我可以像这样使用它:
//将decorator与视图一起使用的示例
让decorator=GreenViewDecorator()
greenView.decoration(使用:decorator)
但是Swift5编译器在decorator.decoration(视图:self)
无法使用类型为“(视图:Self)”的参数列表调用“装饰”
===================总清单==========
协议视图装饰器{
associatedtype视图:可装饰
func装饰(视图:视图)
}
协议修饰{
func装饰(带装饰器:T)
}
扩展可装饰,其中Self:UIView{
func装饰(带装饰器:T){
decorator.decoration(视图:self)
}
}
类GreenView:UIView,可装饰{}
类GreenViewDecorator:ViewDecorator{
typealias视图=绿色视图
func装饰(视图:绿色视图){
view.backgroundColor=UIColor.green
}
}
类ViewController:UIViewController{
@ibvar-greenView:greenView!
重写func viewDidLoad(){
super.viewDidLoad()
让decorator=GreenViewDecorator()
greenView.decoration(使用:decorator)
}
}
参数的类型是关联的类型视图
,但尚未在任何地方确定Self
是该类型,因此如果不确定它是否兼容,则无法传递类型为Self
的参数。例如:
extension Decoratable where Self: UIView {
func decorate<T: ViewDecorator>(with decorator: T) where T.View == Self {
decorator.decorate(view: self)
}
}
扩展可装饰,其中Self:UIView{
func decoration(使用decorator:T),其中T.View==Self{
decorator.decoration(视图:self)
}
}
(但是,如果您这样做,您将很难遵守
可装饰的
协议,因为任何视图装饰器
都需要此方法。您可以将协议更改为具有相同的T.View==Self
限制。)参数的类型是关联的类型视图
,但是还没有在任何地方确定Self
就是该类型,因此,如果不确定它是兼容的,就不能传递类型为Self
的参数。例如:
extension Decoratable where Self: UIView {
func decorate<T: ViewDecorator>(with decorator: T) where T.View == Self {
decorator.decorate(view: self)
}
}
扩展可装饰,其中Self:UIView{
func decoration(使用decorator:T),其中T.View==Self{
decorator.decoration(视图:self)
}
}
(但是,如果您这样做,您将很难遵守
可装饰的
协议,因为任何视图装饰器
都需要此方法。您可以将协议更改为也具有相同的T.View==Self
限制。)谢谢。这是工作<代码>协议可修饰{func decoration(使用decorator:T),其中T.View==Self}谢谢。这是工作<代码>协议可修饰{func decoration(带修饰符:T),其中T.View==Self}