1. 创建 Stack 实例
首先,你需要创建 Stack 的具体实例。由于 Stack 是一个泛型类型,你可以创建不同类型的 Stack 实例。例如,创建一个存储整数的栈和一个存储字符串的栈。
var intStack = Stack<Int>()
var stringStack = Stack<String>()
2. 使用 add 方法添加元素
你可以使用 add 方法将元素添加到栈中。
intStack.add(1)
intStack.add(2)
intStack.add(3)
stringStack.add("Hello")
stringStack.add("World")
3. 使用 printContainer 函数打印栈中的元素
printContainer 函数可以接受任何遵循 Container 协议的类型。由于 Stack 遵循 Container 协议,你可以将 Stack 实例传递给这个函数。printContainer 会打印栈中的最后一个元素。
printContainer(container: intStack) // 打印: Optional(3)
printContainer(container: stringStack) // 打印: Optional("World")
完整代码示例
以下是完整的代码示例,演示了如何创建 Stack 实例,添加元素,并使用 printContainer 打印元素。
protocol Container {
associatedtype Item
mutating func add(_ item: Item)
func get() -> Item?
}
struct Stack<T>: Container {
typealias Item = T
private var elements: [Item] = []
mutating func add(_ item: Item) {
elements.append(item)
}
func get() -> Item? {
return elements.last
}
}
func printContainer<T: Container>(container: T) {
if let item = container.get() {
print(item)
}
}
// 创建 Stack 实例
var intStack = Stack<Int>()
var stringStack = Stack<String>()
// 添加元素
intStack.add(1)
intStack.add(2)
intStack.add(3)
stringStack.add("Hello")
stringStack.add("World")
// 打印栈中的元素
printContainer(container: intStack) // 打印: Optional(3)
printContainer(container: stringStack) // 打印: Optional("World")
解释
-
定义协议和实现:
Container协议定义了一个类型Item和两个方法add和get。Stack结构体遵循了Container协议,并指定了Item为T,使其可以处理任意类型的元素。
-
泛型与协议:
Stack是一个泛型结构体,它实现了Container协议,使得它可以处理任意类型的元素。printContainer函数接受任何遵循Container协议的类型,通过调用get()方法获取并打印元素。
这种方法利用了 Swift 的协议和泛型功能,使得代码既灵活又通用。你可以将任何符合 Container 协议的类型传递给 printContainer,从而实现不同类型的元素处理。