假设我有一个通用的盒子,并且可以使用。如果我在盒子里放一些软的东西,那么盒子也会被压扁。
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 non-@objc protocol type 'Squishable'"
}
}
}
我收集我的squish
函数想要一个恰好是Squishable
的特定类型。但鉴于情况,我似乎无法给它一个......是否有解决方法? (在这个简单的例子中,显然我们可以将squish
更改为接受协议的非泛型,但那是一个完全不同的情况!问题是如何处理这个问题。)
编辑:从Xcode 7 beta 2开始,扩展似乎更灵活。我现在可以写这个,我认为编译器可能知道我的意思:
extension Box: Squishable where T: Squishable
但它遗憾地回应了#34;扩展类型&#39; Box&#39;带约束不能有继承子句&#34;。这个错误似乎明确地禁止了我想做的事情!
答案 0 :(得分:0)
如果我没有弄错, Xcote 7 Beta 2 包括 Swift 2.0 Beta 2 以解决您问题的方式引入扩展条件:< / p>
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 ,因此情况可能会发生变化。无论如何,我非常有信心最终版本将具有你问题所需的功能。