协议扩展中的计算 属性 没有给出预期的结果
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
我正在尝试用 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