仅使用协议

时间:2015-06-23 04:26:35

标签: swift generics protocols

假设我有一个通用的盒子,并且可以使用。如果我在盒子里放一些软的东西,那么盒子也会被压扁。

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;。这个错误似乎明确地禁止了我想做的事情!

1 个答案:

答案 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 ,因此情况可能会发生变化。无论如何,我非常有信心最终版本将具有你问题所需的功能。