协议&泛型

17 阅读2分钟

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")

解释

  1. 定义协议和实现

    • Container 协议定义了一个类型 Item 和两个方法 addget
    • Stack 结构体遵循了 Container 协议,并指定了 ItemT,使其可以处理任意类型的元素。
  2. 泛型与协议

    • Stack 是一个泛型结构体,它实现了 Container 协议,使得它可以处理任意类型的元素。
    • printContainer 函数接受任何遵循 Container 协议的类型,通过调用 get() 方法获取并打印元素。

这种方法利用了 Swift 的协议和泛型功能,使得代码既灵活又通用。你可以将任何符合 Container 协议的类型传递给 printContainer,从而实现不同类型的元素处理。