Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 迅捷5。协议扩展引发编译错误';无法使用Self';类型的参数列表调用函数;_Ios_Swift_Xcode_Swift Protocols_Associated Types - Fatal编程技术网

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}