gpt4 book ai didi

swift - 在 Swift 的闭包中本地维护状态

转载 作者:行者123 更新时间:2023-11-28 07:15:40 25 4
gpt4 key购买 nike

有什么方法可以在闭包中声明一个变量并让它在枚举调用之间保持其状态。具体来说,我想在一个数组上写一个 .filter 闭包,它返回一个没有重复的数组版本。像这样的东西。

let withDupes = ["C", "D", "A", "J", "J", "D", "M", "Z", "A"]  

let noDupes = withDupes.filter {
static var seenLetters: [Character] = [ ] //would like to use static like in C
if !contains(seenLetters, $0) {
seenLetters.append($0)
return true
}
else {
return false
}
}

//noDupes 理想情况下现在是 ["C", "D", "A", "J", "M", "Z"]

当我尝试以这种方式使用 static 时,Swift 报告错误,如果我全局声明 seenLetters,.filter 工作正常。是否有我遗漏或误用的语言功能?

最佳答案

如您所见,Swift 不允许您直接在函数或闭包中定义 static 变量。但是,还有另一种方法可以完成您想要做的事情。如果您将重复数据删除代码移到它自己的函数中,您可以创建一个作用域为该函数的 seenLetters Array 并在您的 filter 打电话。像这样:

let withDupes = ["C", "D", "A", "J", "J", "D", "M", "Z", "A"]

func deduplicate(arr: [String]) -> [String] {
var seenLetters = [String]()
return arr.filter {
if !contains(seenLetters, $0) {
seenLetters.append($0)
return true
}
else {
return false
}
}
}

let noDupes = deduplicate(withDupes)

请注意,由于您可以将函数嵌入到其他函数中,因此它工作得很好:

func someFunction() {
let withDupes = ["C", "D", "A", "J", "J", "D", "M", "Z", "A"]

func deduplicate(arr: [String]) -> [String] {
/* ... */
}

let noDupes = deduplicate(withDupes)
}

如果您出于某种原因不想创建单独的函数来执行此操作,实际上您也可以完全使用闭包来执行此操作。诀窍是将您的闭包包装在另一个定义本地 seenLetters 变量并返回原始闭包的闭包中。这样,seenLetters 的作用域就是外部闭包,您的内部闭包可以按您的意愿使用它。

let noDupes = withDupes.filter({
var seenLetters = [String]()
return {
if !contains(seenLetters, $0) {
seenLetters.append($0)
return true
}
else {
return false
}
}
}()) // Immediately calling the outer closure so that the inner one is returned to filter

需要注意的几件事... 第一,您需要将外部闭包的返回值传递给 filter 函数,只需立即调用它即可。第二,您不能将其用作尾随闭包,因此您必须在 filter 调用中将其包装在 () 中。三,这与使用嵌入式函数基本相同,只是形式更紧凑。

关于swift - 在 Swift 的闭包中本地维护状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26344018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com