- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有什么方法可以在闭包中声明一个变量并让它在枚举调用之间保持其状态。具体来说,我想在一个数组上写一个 .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/
我在一个简单的 GTK 应用程序中有两个小部件: extern crate gdk; extern crate gtk; use super::desktop_entry::DesktopEntry;
我想做这样的事情: const vegetableColors = {corn: 'yellow', peas: 'green'}; const {*} = vegetableColors; cons
该属性它存储在 gradle 中的什么位置? subprojects { println it.class.name // DefaultProject_Decorated depen
我想在 jQuery 闭包中看到窗口属性“otherName”描述符。但 进入 jQuery 闭包 'otherName' 描述符显示未定义,我认为可能 是 getOwnPropertyDescrip
我曾经看过 Douglas Crockford 的一次演讲,在 javascript 的上下文中,他提到将 secret 存储在闭包中可能很有用。 我想这可以在 Java 中像这样天真地实现: pub
我很难理解 Swift 中闭包中真正发生的事情,希望有人能帮助我理解。 class MyClass { func printWhatever(words: String) {
我有两个 3 表:用户、个人资料、friend_request $my_profile_id变量存储用户个人资料ID的值 $my_user_id = Auth::user()->id; $my_pro
我正在尝试通过使用 GLFW 的包装来学习 Swift GLFW 允许添加错误回调: GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cb
我是一名优秀的程序员,十分优秀!