代码之家  ›  专栏  ›  技术社区  ›  Travis Griggs

试图实施?。让模式迅速,这是可能的吗?

  •  0
  • Travis Griggs  · 技术社区  · 6 年前

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

    不过,我真的很喜欢科特林的表达方式。在我看来,它比特定的关键字更通用 if let 混合物因此,为了平价——或者至少为了通过尝试愚蠢的实验来学习——我想我会尝试实现 let 迅速建造。

    因为 是Swift中的一个关键字,我马上发现我需要放置反勾号,或者使用其他名称,比如 cull . 这导致了这个不可编译的代码:

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

    鉴于我的学徒水平的技能,可能有许多问题。但最重要的是,我被告知我不能延长 explained in better detail here ).

    所以任何都不能延期。还有其他语言结构吗 可以 用于使我可以实现类似于Kotlin的 ? 基本上:

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

    作为一个附加问题,我认为即使有一个方法(我确实希望有这样的方法我可以学习),它也不会是相同的,因为Kotlin one可以用于控制流,因为我可以从Kotlin one进行非本地返回,但不能从快速关闭中返回。这也对吗?

    澄清

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

    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
    

    这是我想要的。但我不想扩展系统中的每一个非名义类型来使其工作。我只想在全球范围内给它下个定义。如果可能的话。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Sweeper    6 年前

    事实上,我认为这种方法已经存在。 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 如果要返回闭包内部的可选值,也可以使用。

    是的,在研究了“非本地回报”在科特林的含义之后,我认为你不能在斯威夫特这样做。那些花括号是“闭包”。它们是“封闭的”,所以你不能 return 内部封闭中的周围封闭。