Swift 从数组中删除闭包

Swift 从数组中删除闭包,swift,Swift,从数组中删除闭包但不使用它会导致编译器错误“表达式解析为未使用的函数”。除了将函数赋给一次性变量之外,还有什么好方法可以避免这种情况吗 typealias StringFunction = () -> String var list = [StringFunction]() list.append({ "Hello World!" }) let hi = list[0]() // "Hello Wo

从数组中删除闭包但不使用它会导致编译器错误“表达式解析为未使用的函数”。除了将函数赋给一次性变量之外,还有什么好方法可以避免这种情况吗

typealias StringFunction = () -> String  
var list = [StringFunction]()            
list.append({ "Hello World!" })          
let hi = list[0]()                       // "Hello World!"
list.removeAtIndex(0)                    // Expression resolves to an unused function
let _ = list.removeAtIndex(0)            // Works
这是为我编写的:

typealias StringFunction = () -> String
var list = [StringFunction]()
list.append({ "Hello World!" })
let hi = list[0]()                       // "Hello World!"
list.removeAtIndex(0)()

尽管这确实调用了函数。(感谢Martin R)

将表达式的结果指定给一次性变量是正确的方法。事实上,这是Swift中处理未使用结果的惯用方法

因此(如另一个答案的评论中所述),正确的解决方案是:

typealias StringFunction = () -> String
var list = [StringFunction]()
list.append({ "Hello World!" })
let hi = list[0]()
_ = list.remove(at: 0) // Note there's no need for `let`

这样做不仅可以让你的代码更清楚地表达你的意图(也就是说,它表明你肯定不需要方法的结果),而且还可以帮助编译器执行各种有用的优化。

奇怪,
列表。removeAtIndex(0)
在操场(6.3.2)中工作正常,没有错误。@EricD。这是因为操场接受并使用该值(在右边空白处),而常规代码不接受。哦,好吧,非常感谢您的精确性,很高兴知道。
list.removeRange(0…0)
避免了错误,并且具有看起来像表情符号的附加优势:)(这不是一个严肃的建议…@airpedvelocity哈哈,我确实考虑过,但我讨厌重复但这会调用刚刚删除的函数(对于更一般的函数可能会有不必要的副作用)。不过,我认为@Blix的函数没有副作用,因为他的原始解决方案也会调用该函数。但是
let=list.removeAtIndex(0)
不会调用该函数。为什么不使用返回值时通常会发出警告,但在这种情况下是错误的?这是一个令人恼火的错误,但Martin R的解决方案有效。