你能在 Swift 5 的字符串 .append() 中写一个 forEach() 闭包吗?出现错误,到目前为止

Posted

技术标签:

【中文标题】你能在 Swift 5 的字符串 .append() 中写一个 forEach() 闭包吗?出现错误,到目前为止【英文标题】:Can you write a forEach() closure within a string .append() in Swift 5? Getting error, so far 【发布时间】:2020-04-03 18:36:44 【问题描述】:

我是 Swift 的新手,我正在尝试使用这种语言来熟悉所有很酷的功能。目前,我正在尝试编写一个forEach 闭包来根据forEach 中元素的值附加不同的字符串。变量lightStates 是一个[Bool] 列表。我正在寻找的是statusStr"1""0" 的字符串,这取决于forEach 闭包中的b 元素是真还是假,

我在闭包中的 String in... 行收到 "Declared closure result 'String' is incompatible with contextual type 'Void'" 错误。

   var statusStr : String = ""
   statusStr.append(lightStates.forEach (b:Bool) -> String in return b ? "1":"0")
   return "Lights: \(statusStr) \n"

理想情况下,我想知道我正在做的事情是否允许/可能。但我也愿意接受有关如何获得所需功能的建议(基于[Bool]s 的数组打印"1""0" 的字符串)

【问题讨论】:

【参考方案1】:

是的,首先你做错了。 Foreach 不返回任何内容,并且 append 函数需要添加一些内容。

您可以在此处使用 map 而不是 foreach。像这样的

statusStr.append(contentsOf: array.map  $0.description == "true" ? "1" : "2" )

我知道这不是优化或最佳解决方案,但我只是想在这里清除逻辑。

【讨论】:

【参考方案2】:

选项1(最简单):

lightStates.map  $0 ? "1" : "0"  .joined()

选项 2(可重复使用):

将位存储为整数类型(UInt 最多可容纳 64 个),然后将其转换为字符串。

public extension Sequence 
  /// The first element of the sequence.
  /// - Note: `nil` if the sequence is empty.
  var first: Element? 
    var iterator = makeIterator()
    return iterator.next()
  

  /// - Returns: `nil` If the sequence has no elements, instead of an "initial result".
  func reduce(
    _ getNextPartialResult: (Element, Element) throws -> Element
  ) rethrows -> Element? 
    guard let first = first
    else  return nil 

    return try dropFirst().reduce(first, getNextPartialResult)
  

  /// Accumulates transformed elements.
  /// - Returns: `nil`  if the sequence has no elements.
  func reduce<Result>(
    _ transform: (Element) throws -> Result,
    _ getNextPartialResult: (Result, Result) throws -> Result
  ) rethrows -> Result? 
    try lazy.map(transform).reduce(getNextPartialResult)
  

public extension BinaryInteger 
  /// Store a pattern of `1`s and `0`s.
  /// - Parameter bitPattern: `true` becomes `1`; `false` becomes `0`.
  /// - Returns: nil if bitPattern has no elements.
  init?<BitPattern: Sequence>(bitPattern: BitPattern)
  where BitPattern.Element == Bool 
    guard let integer: Self = (
      bitPattern.reduce(  $0 ? 1 : 0  )  $0 << 1 | $1 
    ) else  return nil 

    self = integer
  

if let lightStatesInteger = Int(bitPattern: lightStates) 
  _ = String(lightStatesInteger, radix: 0b10)

【讨论】:

以上是关于你能在 Swift 5 的字符串 .append() 中写一个 forEach() 闭包吗?出现错误,到目前为止的主要内容,如果未能解决你的问题,请参考以下文章

你能在打开包装时发现 nil 吗?

你能在 IDA 中搜索相邻字节之间的差异吗?

你能在 SQL 中定义“文字”表吗?

Anylogic:你能在编辑框中输入概率分布吗?

Swift 5:简单的字符串 URLRequest

你能在 Sqlite3(使用 Django)中实现不区分大小写的“唯一”约束吗?