假设我有一个泛型框和可变形对象。如果我把东西弄脏了,那么盒子也可以被挤压。仅在泛型中调用泛型,只有协议知识
protocol Squishable {
}
func squish<T: Squishable>(thing: T) {
}
struct Box<T> {
let content: T
}
//Here's what I'd LIKE to write, but it's not valid code:
extension (Box where T: Squishable): Squishable {
//...so I try this instead...
extension Box: Squishable {
func hereBeDragons() {
if content is Squishable {
squish(content as! Squishable)
//...but then: "Generic parameter 'T' cannot be bound to [email protected] protocol type 'Squishable'"
}
}
}
我猜我squish
功能希望出现这种情况是Squishable
一个特定类型。但似乎我不能给它一个,因为情况......有没有解决方法? (在这个简单的例子,我们显然可以改变squish
到非一般接受的协议,但是这是一个完全不同的局面随之而来的问题是这个做什么!)
编辑:作为Xcode 7 beta 2,看起来扩展更灵活。我现在可以写这篇文章,我觉得编译器可能会明白我的意思:
extension Box: Squishable where T: Squishable
但遗憾的是回答“有约束型‘盒子’的延期不能有继承条款”。那个错误似乎明确地禁止了我想要做的事情!
最新的Swift 2.0 Beta(包含在Xcode 7 Beta 2中)使您对'Box'工作的条件扩展。简单的语法修改:-) –
@MatteoPiombo:我激动地下载了它 - 现在我可以提供'where',但是当我试图指定协议一致性时,我遇到了编译问题。如果它为你工作,请写一个答案,以便我可以接受! – andyvn22
我发现这个..https://twitter.com/jadengeller/status/644735717814349824 任何想法他的意思是“写封装结构”? – Austin