2015-06-23 52 views
1

假设我有一个泛型框和可变形对象。如果我把东西弄脏了,那么盒子也可以被挤压。仅在泛型中调用泛型,只有协议知识

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 

但遗憾的是回答“有约束型‘盒子’的延期不能有继承条款”。那个错误似乎明确地禁止了我想要做的事情!

+0

最新的Swift 2.0 Beta(包含在Xcode 7 Beta 2中)使您对'Box'工作的条件扩展。简单的语法修改:-) –

+1

@MatteoPiombo:我激动地下载了它 - 现在我可以提供'where',但是当我试图指定协议一致性时,我遇到了编译问题。如果它为你工作,请写一个答案,以便我可以接受! – andyvn22

+0

我发现这个..https://twitter.com/jadengeller/status/644735717814349824 任何想法他的意思是“写封装结构”? – Austin

回答

0

如果我没弄错了,Xcote 7 Beta 2中包括雨燕2.0 Beta 2的在解决你的问题的方式引入扩展条件语句:

protocol Squishable { 
} 

func squish(thing: Squishable) { 
    print("Squishable") 
} 

struct Box<T> { 
    let content: T 
} 


extension Box where T: Squishable { 
    func hereBeDragons() { 
      squish(content) 
    } 
} 

extension Int: Squishable {} 
let intBox = Box<Int>(content: 4) 
intBox.hereBeDragons() 

let stringBox = Box<String>(content: "Foo") 
stringBox.hereBeDragons() // Compiler complains since String does not conform to Squishable 

请注意这仍然是Beta,所以事情可以改变。无论如何,我非常有信心,最终版本将具有您的问题所需的功能。

+0

有没有不会改变'squish'功能的解决方案? – andyvn22

+0

你说得对,你可以使用这个解决方案在'Box'上调用'hereBeDragons()',但是你仍然不能将'Box'传递给'squish()' - 编译器抱怨它不是'Squishable',因为我们从未正式宣称它是如此。 – andyvn22

+0

Ups要小心“Box”不是_concrete_类型,它是_generic_类型。你不能将'Box'传递给任何函数,你总是通过'Box '。无论如何,你可以考虑更新你的问题,考虑到最新的Swift 2.0补充。而且你会考虑一个Swift 2.0的答案,当然,我的答案对于Swift 1.2和更早的版本来说是无效的。 –