Difference between reverse() and reversed() in swift

时间:2018-06-20 05:03:28

标签: swift

Code1:

let word = "Backwards"
for char in word.reversed() {
    print(char, terminator: "")
}

Code 2:

var characters: [Character] = ["C", "a", "f", "é"]
characters.reverse()
print(characters)

What is the difference between these two codes?

4 个答案:

答案 0 :(得分:2)

reversed()

返回与原始顺序相反的全新收藏

reverse()

自己反向收集

答案 1 :(得分:1)

以下是差异

  

代码1:创建一个迭代器以相反的顺序遍历

let word = "Backwards" 
    for char in word.reversed() {
        print(char, terminator: "") 
}
  

代码2:撤消内容

var characters: [Character] = ["C", "a", "f", "é"]
characters.reverse()
print(characters)

答案 2 :(得分:1)

您自己完美地暴露了差异。您要做的就是查看自己的代码。

  • characters.reverse()更改characters的值。

  • 但是word.reversed()保持word不变。

答案 3 :(得分:0)

我认为 reversereversed 的一个重要缺失方面是它们的时间复杂度。

除了 reverse 是在集合上定义的变异函数并且 reversed 完全返回一个新对象这一事实之外,reverse 的时间复杂度是 O(n)< /strong> 和 reversedO(1)

O(1) 时间复杂度似乎令人惊讶,但是如果我们查看 reversed 调用的返回类型,它会返回 ReversedCollection 对象,该对象在内部指向原始集合,除非是原始集合内容被修改。所以基本上它只是以相反的方式呈现/访问基本集合的元素以节省时间和内存。

以下示例表明,除非修改,否则反转数组与原始数组保持相同:

var originalArray = [1, 2, 3]
var reversedArray = originalArray.reversed()

print("0th index of OriginalArray \(originalArray[0])")
print("0th index of ReversedBaseArray \(reversedArray._base[0])")


print("0th index of OriginalArray \(originalArray.first)")
print("0th index of ReversedBaseArray \(reversedArray.first)")

originalArray[0] = 4 // Modification makes a separate copy of each instance
print("0th index of OriginalArray \(originalArray[1])")
print("0th index of ReversedBaseArray \(reversedArray._base[1])")


// Console Output:
// 0th index of OriginalArray 1
// 0th index of ReversedBaseArray 1


// First element of OriginalArray Optional(1)
// First element of ReversedBaseArray Optional(3)


// 0th index of OriginalArray 4
// 0th index of ReversedBaseArray 1