gpt4 book ai didi

swift - 可选的绑定(bind)、捕获引用和闭包 [可能的错误]

转载 作者:可可西里 更新时间:2023-11-01 02:20:17 25 4
gpt4 key购买 nike

我一直在努力让自己熟悉 Swift,但我最近遇到了这个涉及可选绑定(bind)和在闭包上下文中捕获引用的特殊问题。

给定以下声明(为清楚起见缩写了代码;最后提供了完整代码):

class Thing
{
func giveNameIfSize() -> String? {
/.../
}
}

typealias IterationBlock = (Thing) -> Bool

class Iterable
{
func iterate(block: IterationBlock) {
/.../
}
}

Iterable 对象可以存储Things 的集合,并可以使用闭包迭代它们。现在假设我们想要找到设置了 size 属性的 Thing 对象的名称。我们可以这样做:

var name: String?
iterable.iterate { (someThing) -> Bool in
/*
Assigning the result of the giveNameIfSize() function to
a variable 'name' declared outside of the closure and
captured by reference
*/
if name = someThing.giveNameIfSize() {
return true
}
return false
}

但是,上面的代码会产生以下编译错误:

Cannot assign to immutable value of type 'String?'

奇怪的是,当我们在可选绑定(bind)中使用另一个变量时,问题就消失了:

iterable.iterate { (someThing) -> Bool in
if var tempResult = someThing.giveNameIfSize() {
name = tempResult
return true
}
return false
} /* COMPILES AND RUNS */

如果我们在可选绑定(bind)之外为外部声明的变量 name 赋值,问题也会得到解决:

iterable.iterate { (someThing) -> Bool in
name = someThing.giveNameIfSize()
if name != nil {
return true
}
return false
} /* ALSO COMPILES AND RUNS */

完整源代码 here .

观察:使用 Swift 1.2 而非 2.0 测试了此代码。

====

这是一个错误吗?或者我错过了什么?

最佳答案

您收到的错误有点误导,但这里的根本问题是您正在尝试执行 Swift 不支持的操作。在 Swift 中,您不能在条件中使用赋值的结果。

话虽这么说,您提出的两种替代方法都可以使用,但我倾向于认为这两种方法中的第一种方法更快捷一些。

关于swift - 可选的绑定(bind)、捕获引用和闭包 [可能的错误],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31164472/

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