你能在 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() 闭包吗?出现错误,到目前为止的主要内容,如果未能解决你的问题,请参考以下文章