【问题标题】:Is there a way I could iterate over elements in Swift while using method names?有没有一种方法可以在使用方法名称时迭代 Swift 中的元素?
【发布时间】:2019-12-19 00:19:52
【问题描述】:
let x = [1, 2, 2, 3, 3, 3, 1].reversed()
for element in x.method_name() {
    print(element)
}

返回

“ReversedCollection”类型的值没有成员“method_name”。

为什么?如何引用我创建的方法并让它执行我需要它执行的功能?

但是,如果我使用以下内容,问题似乎消失了。我只想传入一个数组并让函数完成所有工作,即:

let x = Array([1, 2, 2, 3, 3, 3, 1].reversed())

【问题讨论】:

  • 在哪里你创建了method_name方法?
  • 所以,我已经单独创建了方法名称作为数组的扩展
  • extension Array where Element:Equatable { func method_name() -> [Element] { total.append(element) } } }
  • 这种方法没有多大意义。 total 是什么? element 是什么?它的签名说它返回一个数组,但它没有。请注意,您可以edit您的问题。
  • 是的,它的签名说它返回一个数组,但是当我在它上面使用 .reversed() 时,它似乎将数组转换为一个反向集合。

标签: arrays swift


【解决方案1】:

如果您不完全理解 reversed 重载背后的动机,返回 ReversedCollection 而不是 ArrayReversedCollection 只是原始数组的“反转视图”。它不是原始数组的反向副本。这是为了节省时间和空间,就像一个“懒惰”的收藏。详情请见this post

这就是为什么您需要 Array(...) 初始化程序将反向集合转回数组的原因。您正在选择摆脱懒惰。

另一方面,reversed 的另一个重载直接返回 Array。通常不会选择此重载,因为它是在不太具体的类型中定义的 - Sequence,而不是 Array。您需要提供有关类型的足够信息才能使用此重载:

let x: [Int] = [1, 2, 2, 3, 3, 3, 1].reversed()

【讨论】:

  • 谢谢你。如果列表有字符串或任何其他数据类型,我将如何定义“x”以接受数组中的所有这些数据类型?
  • 或者我可以要求我的方法为我做这件事吗?链接下方提供了类似的链接:[stackoverflow.com/questions/59382540/…
  • @DDD 您的意思是“要求您的方法为您将反向集合转换为数组”?嗯,是的,这行得通,只需将您的方法写为ReversedCollection 上的扩展名即可。但是你的方法可能违反了SRP
猜你喜欢
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 2010-10-25
  • 2020-06-30
  • 2014-01-25
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
相关资源
最近更新 更多