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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift 3:加入reversed()数组时出错相关的知识,希望对你有一定的参考价值。

我有这样的代码:

    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 ###
"
        let bottomDivider = "
############
"
        let stackElements = self.array.reversed().joined(separator: "
") // GETTING ERROR
        return topDivider + stackElements + bottomDivider
    }

}

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

我无法加入那个反向阵列。

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

在这里,他们已经成功地使用String完成了struct。

我能知道我怎么能在这里实现同样的目标?

答案

问题是joined函数要求分隔符与要连接的值具有相同的数据类型。由于self.arrayT的数组,你不能通过String作为分隔符。这种不匹配导致错误。

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

将某些东西转换为String的一种方法是在其上调用description方法。但要做到这一点,你需要将你的T限制为那些提供来自descriptionCustomStringConvertible方法的类型。

将您的班级声明更改为:

class Stack<T:CustomStringConvertible>: CustomStringConvertible {

然后你的description财产:

var description: String {
    let topDivider = "### STACK ###
"
    let bottomDivider = "
############
"
    let stackElements = self.array.reversed().map { $0.description }.joined(separator: "
")
    return topDivider + stackElements + bottomDivider
}
另一答案

将您的泛型类型T映射到String,然后应用joined()函数。

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

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

以上是关于Swift 3:加入reversed()数组时出错的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 6 - SWIFT - 访问数组时出错

在 Swift 中总结数组值时出错

Apollo graphQL:在 iOS swift 中使用自定义标量时解码数组时出错

Array<MutableCollection> 的 Swift 扩展不允许 reverse()

Alamofire - 从 Swift 2 转换为 Swift 3 时出错

从 Swift 2 转换为 Swift 3 时出错