繁体   English   中英

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

[英]Computed Property in Protocol Extension not giving desired result

我正在尝试用 Swift 语言实现 Stack。 因此,我创建了一个协议Container并在另一个协议Stack中继承它,现在为了跟踪堆栈中的元素数量,我在Container Protocol 中引入了一个计算变量count ,并在Container协议的扩展中给了它一个 getter。 (我可以通过arr.count跟踪元素的数量,但我正在探索其他方法来做同样的事情)最后,我将一个元素压入堆栈,但是当我打印count的值时它仍然是 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM