Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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
Swift 协议扩展,其中Self为ClassA或ClassB_Swift_Protocols - Fatal编程技术网

Swift 协议扩展,其中Self为ClassA或ClassB

Swift 协议扩展,其中Self为ClassA或ClassB,swift,protocols,Swift,Protocols,我有一个协议,在一致性类为ClassA或ClassB的情况下,我希望为其提供默认功能。是否可以在协议扩展where子句中使用|?我尝试了以下方法,但无效: extension Protocol where Self: ClassA || Self: ClassB { func method() { // implementation if conforming class is ClassA OR ClassB } } 不,您不能在协议扩展的where子句中使用

我有一个协议,在一致性类为
ClassA
ClassB
的情况下,我希望为其提供默认功能。是否可以在协议扩展where子句中使用
|
?我尝试了以下方法,但无效:

extension Protocol where Self: ClassA || Self: ClassB {
    func method() {
        // implementation if conforming class is ClassA OR ClassB
    }
}

不,您不能在协议扩展的
where
子句中使用
|
(或类似的内容)


如果扩展方法需要同时存在于
ClassA
ClassB
中的某些功能,那么您可以在协议中定义这些功能(这两个类都符合),并将扩展约束到该协议。

否,您不能使用
|
(或类似的东西)在协议扩展的
where
子句中


如果扩展方法需要在
ClassA
ClassB
中都存在的某些功能,那么您可以在协议中定义这些功能(这两个类都符合),并将扩展限制到该协议。

目前根本不可能。一种解决方案是创建两个不同的扩展

扩展协议,其中Self:ClassA{
func方法(){
公共方法()
}
}
扩展协议,其中Self:ClassB{
func方法(){
公共方法()
}
}
private func commonMethod(){
//把你的东西放在这里
}
或者创建一个公共协议,假设
ClassA
ClassB
符合此协议

协议公共协议{}
类ClassA:协议,CommonProtocol{}
类ClassB:协议,CommonProtocol{}
扩展协议,其中Self:CommonProtocol{
func方法(){
//你的东西
}
}

目前这根本不可能。一种解决方案是创建两个不同的扩展

扩展协议,其中Self:ClassA{
func方法(){
公共方法()
}
}
扩展协议,其中Self:ClassB{
func方法(){
公共方法()
}
}
private func commonMethod(){
//把你的东西放在这里
}
或者创建一个公共协议,假设
ClassA
ClassB
符合此协议

协议公共协议{}
类ClassA:协议,CommonProtocol{}
类ClassB:协议,CommonProtocol{}
扩展协议,其中Self:CommonProtocol{
func方法(){
//你的东西
}
}

什么不起作用,你会收到错误消息吗?不,语法不可识别。你不能–定义两个类都符合的协议,然后使用
where Self:CommonProtocol
。什么不起作用,你会收到错误消息吗?不,语法不可识别您不能–定义两个类都符合的协议,并使用
where Self:CommonProtocol
。谢谢。我现在意识到这是唯一的方法,因为扩展无法确定您是指ClassA还是ClassB,所以您需要一个协议来定义它们的共性。谢谢。我现在意识到这是唯一的方法,因为扩展无法确定您是指ClassA还是ClassB,所以您需要一个协议来定义它们的共性。