gpt4 book ai didi

swift - 尝试在 Swift 中实现 ?.let 模式,有可能吗?

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

我一直在 Swift 和 Kotlin 之间来回移植代码。灵感来自 this answer ,我一直在使用 ?.let { } ?: run {} 作为我在 Swift 中使用 if let ... { } else {} 的许多地方的替代品.

不过,我真的很喜欢 Kotlin 表达式。在我看来,它比关键字特定的 if let 混合物更通用。因此,为了平等起见——或者至少为了通过尝试愚蠢的实验来学习——我想我会尝试在 Swift 中实现 let 构造。

因为 let 是 Swift 中的关键字,我马上发现我需要加反引号,或者使用不同的名称,例如 cull。这导致了这段不可编译的代码:

extension Any {
func cull<R>(block:(Self) -> R) -> R {
return block(self)
}
}

鉴于我的学徒水平技能,可能有很多问题。但最重要的是,我被告知我无法扩展 Any(即 explained in better detail here )。

所以 Any 不能被扩展。我可以使用任何其他语言构造来实现它,以便我可以实现类似于 Kotlin 的 let 的东西吗?基本上:

<expression>.foo { <expressionResult> in ... }

作为奖金/旁白问题,我认为即使有办法(我希望有这样我可以学习),它也不会一样,因为 Kotlin 可以用于控制流程,因为我可以从 Kotlin 返回非本地返回,但不能从 Swift 闭包返回。这也是正确的吗?

澄清

基本上,我可以为指定类型实现 Kotlin let 模式:

protocol Cullable {}

extension Cullable {
func cull<R>(_ block:(Self) -> R) -> R {
return block(self)
}
}

extension Int:Cullable { }

42.cull { thing in print(thing) } // this will print 42

这如我所愿。但我不想扩展系统中的每一个非标称类型以使其工作。我只想以某种方式在全局范围内定义它。如果可能的话。

最佳答案

其实我觉得Optional里面已经有这样的方法了。虽然这只是针对可选项,但至少它解决了你缺少?.let 的问题。该方法称为 map .

let optional: String? = "hello"
optional.map { print($0) } // prints hello
// note how I did not unwrap the optional. I called "map" directly on the optional, not the wrapped "String".

您可以将值映射到另一个值,或者Void,就像我上面做的那样。

我不认为你可以对所有东西都使用 let 方法。

flatMap如果您想在闭包内返回可选值,也可用。

是的,在了解了“非本地返回”在 Kotlin 中的含义后,我认为您不能在 Swift 中做同样的事情。那些大括号是“闭包”。它们是“封闭的”,因此您不能在内部闭包中返回周围的闭包。

关于swift - 尝试在 Swift 中实现 ?.let 模式,有可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51690570/

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