3 回答
TA贡献1807条经验 获得超9个赞
解决您的更新用例:
(btw Printable已经是标准的Swift协议,因此您可能希望选择其他名称以避免混淆)
要对协议实现者实施特定的限制,您可以限制协议的类型别名。因此,创建需要元素可打印的协议集合:
// because of how how collections are structured in the Swift std lib,
// you’d first need to create a PrintableGeneratorType, which would be
// a constrained version of GeneratorType
protocol PrintableGeneratorType: GeneratorType {
// require elements to be printable:
typealias Element: Printable
}
// then have the collection require a printable generator
protocol PrintableCollectionType: CollectionType {
typealias Generator: PrintableGenerator
}
现在,如果您想实现一个只能包含可打印元素的集合:
struct MyPrintableCollection<T: Printable>: PrintableCollectionType {
typealias Generator = IndexingGenerator<T>
// etc...
}
但是,这可能几乎没有什么实际用途,因为您不能像这样约束现有的Swift集合结构,只能实现它们。
相反,您应该创建通用函数,以将其输入限制为包含可打印元素的集合。
func printCollection
<C: CollectionType where C.Generator.Element: Printable>
(source: C) {
for x in source {
x.print()
}
}
- 3 回答
- 0 关注
- 615 浏览
添加回答
举报