swift中reverse()和reversed()之间的差异

swift中reverse()和reversed()之间的差异,swift,Swift,代码1: 代码2: let word = "Backwards" for char in word.reversed() { print(char, terminator: "") } 这两种代码之间的区别是什么?reversed() 以与原始集合相反的顺序返回全新集合 反向() 反向收集它自己。反向() 以与原始集合相反的顺序返回全新集合 反向() 反向收集它自己。以下是不同之处 代码1:创建一个迭代器以按相反顺序遍历 代码2:反转内容 以下是差异 代码1:创建一个迭代器以按相反顺序

代码1:

代码2:

let word = "Backwards"
for char in word.reversed() {
    print(char, terminator: "")
}
这两种代码之间的区别是什么?

reversed()

以与原始集合相反的顺序返回全新集合

反向()

反向收集它自己。

反向()

以与原始集合相反的顺序返回全新集合

反向()


反向收集它自己。

以下是不同之处

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

代码2:反转内容


以下是差异

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

代码2:反转内容


你自己完全暴露了这一差异。您所要做的就是查看自己的代码

  • characters.reverse()
    更改
    字符的值

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


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

      • characters.reverse()
        更改
        字符的值

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


        • 我认为
          反向
          反向
          的一个重要缺失方面是它们的时间复杂性


          除了
          reverse
          是在集合上定义的变异函数,并且
          reversed
          返回一个新对象之外,
          reverse
          的时间复杂度是O(n)
          reversed
          O(1)

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

          下面的示例显示,反转数组与原始数组保持相同,除非对其进行修改:

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

          我认为
          reverse
          reversed
          的一个重要缺失是它们的时间复杂性


          除了
          reverse
          是在集合上定义的变异函数,并且
          reversed
          返回一个新对象之外,
          reverse
          的时间复杂度是O(n)
          reversed
          O(1)

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

          下面的示例显示,反转数组与原始数组保持相同,除非对其进行修改:

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

          reverse
          更改对象(也称为“破坏性操作”,因为原始对象不再可用),
          reversed
          创建新对象(“非破坏性操作”)。您编写了代码。你不明白哪一部分?不,输出非常不同。这两个区块做两件完全不同的事情。是的,有一个显著的区别。
          reverse
          更改对象(也称为“破坏性操作”,因为原始对象不再可用),
          reversed
          创建一个新对象(“非破坏性操作”)。您编写了代码。你不明白哪一部分?不,输出非常不同。这两个区块做两件完全不同的事情。是的,这是一个显著的区别。
          reversed()
          返回一个集合,而不是数组。
          reversed()
          返回一个集合,而不是数组。
          var characters: [Character] = ["C", "a", "f", "é"]
          characters.reverse()
          print(characters)
          
          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