【问题标题】:Array / Stack contains function数组/堆栈包含函数
【发布时间】:2015-01-08 22:28:51
【问题描述】:

我想为我的 STACK 结构提供函数 contains(element: Element),该函数返回一个布尔值,以确定 var 内容是否包含提供的元素。

struct Stack<T>: SequenceType, Equatable, Printable, DebugPrintable {
     typealias Element = T
     private var contents: [Element]
     var top: Int

     init(arrayLiteral elements: T...) {
          self.init(elements) }

     // easier initialization
     init<S: SequenceType where S.Generator.Element == Element>(_ sequence: S) {
          self.contents = [Element]()
          Swift.map(sequence) {self.contents[$0] = true }
     }

     // returns TRUE if the Stack contains <T> 'element'
     func contains(element: Element) -> Bool {
         return contents.filter(element != nil) ?? false
     }

我希望能够定义一个新的 STACK 并像这样搜索它的内容:

 var newStack: Stack = [5, 23, 45, 100]
 newStack.contains(45)                      // returns TRUE

目前编译器报错:

“不能调用'??'带有类型为 '(Array, BooleanLiteralConvertible)' 的参数列表"

【问题讨论】:

  • 有什么问题?还有什么问题?
  • Antonio — 抱歉,我忘记添加了...已将其添加到底部。
  • 那里的初始化程序也有问题。您从一个空白数组开始,然后尝试使用一系列传入类型作为该数组的索引?鉴于您没有将 Element 限制为数字类型,这似乎行不通。此外,您会立即离开空白数组的末尾并获得异常。
  • Brad — 是的,我在某种程度上明白你的意思。有了这个,我试图允许初始化而不需要先声明变量。类似于 Array 允许一举完成分配和初始化。我目前有:
  • init(_ sequence: S) { self.contents = [Element]() Swift.map(sequence) { self.contents[ $0] } }

标签: swift generics swift-array


【解决方案1】:

首先,泛型元素类型T必须符合Equatable,这样 您可以使用== 将给定元素与数组元素进行比较:

struct Stack<T : Equatable> : YourProtocols... {

filter 方法采用一个闭包来测试每个数组元素:

let filtered = contents.filter({ $0 == element})

并返回一个新数组,该数组仅包含要测试的元素(“谓词”) 产生true。但是你不需要一个新的数组,你只想测试成员资格, 这可以通过 Swift contains() 函数来完成:

func contains(element: Element) -> Bool {
    return Swift.contains(contents, element)
}

顺便说一句,您的 init 方法无法编译。好像是从别的地方抄来的 元素存储在字典中的集合类型。在这里你可以简单 使用可以用序列初始化数组:

init<S: SequenceType where S.Generator.Element == Element>(_ sequence: S) {
    self.contents = Array(sequence)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-03
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 2019-06-18
    相关资源
    最近更新 更多