Swift 3:加入reversed()数组时出错

时间:2018-03-11 04:07:47

标签: arrays swift generics

我有这样的代码:

    class Stack<T>: CustomStringConvertible {

    fileprivate var array: [T] = []

    func pop() -> T? {
        let popItem = self.array.popLast()
        print("POP ITEM : \(popItem)")
        return popItem
    }

    func push(item: T) {
        print("PUSH ITEM : \(item)")
        array.append(item)
    }

    var isEmpty: Bool {
        return self.array.isEmpty
    }

    var count: Int {
        return self.array.count
    }

    var description: String {
        let topDivider = "### STACK ###\n"
        let bottomDivider = "\n############\n"
        let stackElements = self.array.reversed().joined(separator: "\n") // GETTING ERROR
        return topDivider + stackElements + bottomDivider
    }

}
  

错误:没有更多上下文的表达式类型不明确

我无法加入该反向阵列。

参考:https://www.raywenderlich.com/149213/swift-algorithm-club-swift-stack-data-structure

他们已经在struct中成功完成了String。

我能知道我怎么能在这里实现目标吗?

2 个答案:

答案 0 :(得分:0)

将您的通用类型T映射到String,然后应用joined()功能。

joined仅适用于String类型的元素,此处编译器不知道T的类型。

let stackElements = self.array.map{"\($0)"}.reversed().joined(separator: "\n")

答案 1 :(得分:0)

问题是joined函数要求分隔符与要连接的值具有相同的数据类型。由于self.arrayT的数组,因此您无法传递String作为分隔符。这种不匹配导致错误。

由于这是您的description属性,并且您的目标是获取数组的字符串表示形式,因此一种解决方案是将T数组映射到String数组。然后,您可以使用换行符分隔符加入String数组。

将某些内容转换为String的一种方法是在其上调用description方法。但要做到这一点,您需要将T限制为仅提供来自description的{​​{1}}方法的类型。

将您的班级声明更改为:

CustomStringConvertible

然后将您的class Stack<T:CustomStringConvertible>: CustomStringConvertible { 属性设置为:

description