我想在我的代码中使用泛型堆栈,其中泛型类型必须符合CustomStringConvertible
协议。我有一个符合CustomStringConvertible
的协议,我想创建一个这样的堆栈协议类型。但是,当我尝试这样做时,我收到一个错误。为了简单起见,我用协议P和struct S说明了下面的问题,它采用了协议P.
以下代码无法编译:
struct Stack<E: CustomStringConvertible> {
var items = [E]()
mutating func push(_ item: E) { items.append(item) }
mutating func pop() -> E { return items.removeLast() }
}
protocol P: CustomStringConvertible {}
struct S: P {
var description: String { return "Struct S" }
}
var protocolStack = Stack<P>() // error
protocolStack.push(S())
print(protocolStack.pop().description)
似乎错误是由通用类型应符合CustomStringConvertible
的要求引起的。如果我删除此要求,代码将编译并运行正常,如下所示:
struct Stack<E> {
var items = [E]()
mutating func push(_ item: E) { items.append(item) }
mutating func pop() -> E { return items.removeLast() }
}
protocol P {
var description: String { get }
}
struct S: P {
var description: String { return "Struct S" }
}
var protocolStack = Stack<P>()
protocolStack.push(S())
print(protocolStack.pop().description) // prints: Struct S
- 更新 -
刚刚发现第一个面板中的代码在通过struct Stack的扩展引入CustomStringConvertible
一致性要求时起作用。
struct Stack<E> {
var items = [E]()
mutating func push(_ item: E) { items.append(item) }
mutating func pop() -> E { return items.removeLast() }
}
extension Stack where E: CustomStringConvertible {}
protocol P: CustomStringConvertible {}
struct S: P {
var description: String { return "Struct S" }
}
var protocolStack = Stack<P>()
protocolStack.push(S())
print(protocolStack.pop().description) // prints: Struct S