我有这样的代码:
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。
我能知道我怎么能在这里实现目标吗?
答案 0 :(得分:0)
将您的通用类型T
映射到String
,然后应用joined()
功能。
joined
仅适用于String
类型的元素,此处编译器不知道T
的类型。
let stackElements = self.array.map{"\($0)"}.reversed().joined(separator: "\n")
答案 1 :(得分:0)
问题是joined
函数要求分隔符与要连接的值具有相同的数据类型。由于self.array
是T
的数组,因此您无法传递String
作为分隔符。这种不匹配导致错误。
由于这是您的description
属性,并且您的目标是获取数组的字符串表示形式,因此一种解决方案是将T
数组映射到String
数组。然后,您可以使用换行符分隔符加入String
数组。
将某些内容转换为String
的一种方法是在其上调用description
方法。但要做到这一点,您需要将T
限制为仅提供来自description
的{{1}}方法的类型。
将您的班级声明更改为:
CustomStringConvertible
然后将您的class Stack<T:CustomStringConvertible>: CustomStringConvertible {
属性设置为:
description