【问题标题】:Swift3, extension to mutablizate a String arraySwift3,可变字符串数组的扩展
【发布时间】:2016-12-14 15:21:18
【问题描述】:

我相信你会像这样对[String] 进行扩展...

extension Sequence where Iterator.Element == String {

假设我想改变数组 - 我的意思是说,改变数组中的每个字符串。怎么办?

extension Sequence where Iterator.Element == String {
   func yoIzer() {
      for s in self { s = "yo " + s }
   }
}

这行不通。

(这只是一个示例,可能需要更复杂的处理:您可能希望避免只使用过滤器。)

【问题讨论】:

  • 为什么要扩展? array = array.map { "yo " + $0 }
  • 确实如此;我对 Extensions 中的突变产生了兴趣。另外,就此而言,我不确定extension Sequence where Iterator.Element == String 是否真的是当今最好的定义,对于[String] 上的扩展名
  • 感谢@LeoDabus,让我闭嘴。真的你应该把它作为一个答案来声明这些点......对未来的读者也很有用
  • 你的代码太荒谬了。更改s 不会改变s 来自的数组/序列的任何内容。 s 是副本!
  • 老兄!荒谬的代码是来这里的原因! :)

标签: ios swift3 extension-methods


【解决方案1】:

序列是不可变的,在任何情况下更改元素 s 都不会改变它所来自的序列的任何内容(s 是一个副本)。

你想说的是:

extension MutableCollection where Iterator.Element == String {
    mutating func yo() {
        var i = self.startIndex
        while i != self.endIndex {
            self[i] = "yo" + self[i]
            i = self.index(after: i)
        }
    }
}

这是一个测试:

var arr = ["hey", "ho"]
arr.yo()
print(arr)
// ["yohey", "yoho"]

这种方法实际上直接来自 Swift 文档。

【讨论】:

  • 但是,正如已经指出的那样,当map 已经存在时,这样做似乎毫无意义。
  • "A Sequence is not mutable" facepalm,也谢谢你
  • enumerated().forEach({ self[$0.offset] = "yo " + $0.element })
  • @LeoDabus:这只会为带有Index == Int 的集合编译。
  • 你可以在扩展中改变一个函数,而不是在一个类中改变一个普通函数的基本认识论原因是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 2016-08-22
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
相关资源
最近更新 更多