使Collection符合自定义协议

时间:2018-10-26 12:00:35

标签: ios swift collections swift-protocols

我想为所有具有isEmpty的集合类型添加一个通用参数,以便它们也可以具有isNotEmpty,当我尝试使Collection符合Occupiable时编译错误

  

错误在这里:协议'Collection'的扩展不能有继承子句

String还符合Array固有的协议,因此一旦找到上述问题的解决方案,我们是否可以删除extension String: Occupiable { }

// Anything that can hold a value (strings, arrays, etc)
protocol Occupiable {
    var isEmpty: Bool { get }
    var isNotEmpty: Bool { get }
}

// Give a default implementation of isNotEmpty, so conformance only requires one implementation
extension Occupiable {
    var isNotEmpty: Bool {
        return !isEmpty
    }
}

extension String: Occupiable { }

//  error here : Extension of protocol 'Collection' 
//  cannot have an inheritance clause
extension Collection: Occupiable { }

2 个答案:

答案 0 :(得分:0)

此处您已使用isEmpty和isNotEmpty变量创建了Occupiable协议 因此,当我们在任何类中实现协议时,这两个变量需要声明为完全填充协议。但是在这里您已经在Occupiable的扩展程序中声明了isNotEmpty变量,因此现在在我们实现协议的类中只有一个isEmpty强制性的。 所以在收集协议里面是isEmpty,所以我们需要扩展协议。但是它在String中工作,因为string是struct。
您需要为Collection编写如下代码:

extension Collection where Self : Occupiable {}

答案 1 :(得分:0)

您需要设置一致性约束。 这将纠正错误。

extension Collection where Self: Occupiable { }