在Swift中创建符合CustomStringConvertible的协议类型的堆栈时出错

时间:2016-10-09 19:38:31

标签: ios swift protocols

我想在我的代码中使用泛型堆栈,其中泛型类型必须符合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

0 个答案:

没有答案