Swift栈实现中添加contains方法的需求及现有实现代码
给你的泛型Stack添加contains方法
嘿,这个需求很好实现!不过因为你的Stack是泛型结构体,要判断元素是否存在,得让元素类型T支持相等比较——也就是遵循Equatable协议。这里有两种常见的实现方式,你可以根据自己的场景选择:
方式一:让整个Stack的元素类型遵循Equatable
这种方式下,所有使用该Stack的场景,元素都必须是Equatable类型,好处是方法调用起来更直接:
public struct Stack<T: Equatable> { fileprivate var array = [T]() public var isEmpty: Bool { return array.isEmpty } public var count: Int { return array.count } public mutating func push(_ element: T) { array.append(element) } public mutating func pop() -> T? { return array.popLast() } public var top: T? { return array.last } // 新增的contains方法 public func contains(_ element: T) -> Bool { return array.contains(element) } }
方式二:仅给contains方法添加Equatable约束
如果你不想限制整个Stack的元素必须是Equatable(比如偶尔需要存储不支持相等比较的类型),可以只给contains方法单独加上约束:
public struct Stack<T> { fileprivate var array = [T]() public var isEmpty: Bool { return array.isEmpty } public var count: Int { return array.count } public mutating func push(_ element: T) { array.append(element) } public mutating func pop() -> T? { return array.popLast() } public var top: T? { return array.last } // 仅当T遵循Equatable时,这个方法才会生效 public func contains(_ element: T) -> Bool where T: Equatable { return array.contains(element) } }
小提醒
两种方案都是直接复用了Swift数组自带的contains方法,因为你的Stack底层是基于数组实现的,这样既高效又不用自己重复造轮子~
内容的提问来源于stack exchange,提问作者Simon.T
相关产品推荐
相关产品推荐

