gpt4 book ai didi

swift - 在仅了解协议(protocol)的情况下在泛型中调用泛型

转载 作者:行者123 更新时间:2023-11-28 09:05:10 25 4
gpt4 key购买 nike

假设我有一个通用盒子和可压扁的物体。如果我在盒子里放一些松软的东西,那么盒子也会被压扁。

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 更改为接受协议(protocol)的非泛型,但那是完全不同的情况!问题是如何处理这个。)

编辑:从 Xcode 7 beta 2 开始,扩展似乎更加灵活。我现在可以写这个了,我想编译器可能明白我的意思:

extension Box: Squishable where T: Squishable

但它遗憾地回应“带有约束的‘Box’类型的扩展不能有继承子句”。该错误似乎明确禁止了我想做的事情!

最佳答案

如果我没弄错的话,Xcote 7 Beta 2 包括 Swift 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

请注意,这仍是测试版,因此情况可能会发生变化。无论如何,我非常有信心最终版本将具有您的问题所需的功能。

关于swift - 在仅了解协议(protocol)的情况下在泛型中调用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30993855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com