协议扩展中的计算 属性 没有给出预期的结果

Computed Property in Protocol Extension not giving desired result

我正在尝试用 Swift 语言实现 Stack。所以,我创建了一个协议 Container 并在另一个协议 Stack 中继承了它,现在为了跟踪堆栈中的元素数量我在 Container 协议中引入了一个计算变量 count并在 Container 协议的扩展中给它一个 getter。 (我可以通过 arr.count 来跟踪元素的数量,但我正在探索其他方法来做同样的事情)最后,我将一个元素压入堆栈,但是当我打印 [=14 的值时=] 还是0,为什么count的值不是1?

import UIKit
import Foundation

protocol Container{
    associatedtype Item
    var arr : [Item]{get set}
    var count : Int{get}
}

protocol Stack : Container {
    mutating func push(item : Item) -> ()
    mutating func pop() -> Item?
}

extension Container {
    var count : Int {
        get {
            return arr.count
        }
    }
}

struct MyStack<Element> : Stack {
    var count: Int
    
    typealias Item = Element
    var arr : [Element] = []
    
    mutating func push(item : Element) -> (){
        arr.append(item)
    }
    
    mutating func pop() -> Element? {
        if count == 0 {
            return nil
        }
        return arr[count - 1]
    }
}

var obj = MyStack<Int>(count : 0)
obj.push(item: 1)
print(obj.arr) // arr = [1]
print(obj.count) //count = 0 Why the value of count is not 1

问题是您将 count 声明为 MyStack 上的存储 属性。如果一致类型本身不提供自己的实现,则协议中的默认实现仅由一致类型使用。

因此您需要从 MyStack 中删除 count 属性 这样,将使用 Container 协议中的默认 count 实现.

struct MyStack<Element> : Stack {
    typealias Item = Element
    var arr : [Element] = []
    
    mutating func push(item : Element) -> (){
        arr.append(item)
    }
    
    mutating func pop() -> Element? {
        if count == 0 {
            return nil
        }
        return arr[count - 1]
    }
}

var obj = MyStack<Int>()
obj.push(item: 1)
print(obj.arr) // arr = [1]
print(obj.count) // 1