swift 5.1以错误的方式评估闭包

问题描述 投票:1回答:1

我在评估一行代码时遇到问题如果我将其分解为两行,则可以正常工作,但是在一行代码中,它只是以“新”到“错误”的方式进行评估。

我问这个问题的主要原因,不是解决它,我知道我可以使用括号来解决它,并将其分解为两行,但是不想解决它,我只想知道为什么对其求值像这样,如果有解决方案,请执行以下操作:一些设置要打补丁,以便可以在一行代码中工作:

这里有两行代码

working code

这里有试图做同样的事情的代码,但是您会看到一个错误:

error code

完整的代码都可以使用,不可以使用:

class ClosuresStack {

var dic = Dictionary<String,(()->String)->String >()

subscript(_ str:String)-> (()->String)->String {
get {
return dic[str]!

}
set {
dic[str] = newValue
}

}


}

func createClosuresStak() -> ClosuresStack {

   let cs =  ClosuresStack()
    func takesAClosureReturnA_string(_ closure:()->String) ->String {
        return closure() + " Two"
    }

    cs["C"] = takesAClosureReturnA_string

    return cs
}

let c = createClosuresStak()["C"]
let str = c{"One"}
print(str)  // print:  One Two



let c = createClosuresStak()["C"]{"One"} // error -->

[现在,我想以某种方式理解它将以单行代码运行的方式进行更改:这意味着'createClosuresStak()["C"]{"One"}'的求值将在[“ C”]之后创建一个闭包,然后从该点开始编写{"One"}将对其进行全面评估:

let c = createClosuresStak()["C"]{"One"}

使'c'为字符串

如果不可能,我也需要知道,tnx :)

swift xcode
1个回答
0
投票

尾随闭包语法包括尾随闭包作为方法调用的附加参数。对数组进行下标实际上是在幕后进行的函数调用,Swift试图将该闭包作为第二个参数传递给下标调用。

至少有3种方法可以解决此问题,但仍将其放在一行上:

选项1:使用显式调用传递闭包,而不使用trailing闭包语法

()中包装闭包以使调用明确:

let c1 = createClosuresStak()["C"]({"One"})
print(c1)

选项2:用括号括住createClosureStak()["C"]

这使Swift知道下标仅将"C"作为参数,并允许尾随闭包语法按预期方式工作:

let c2 = (createClosuresStak()["C"]){"One"}
print(c2)

选项3:在尾随闭包语法之前将.self添加到结果中:

这再次完成了下标调用并避免了混乱。

let c3 = createClosuresStak()["C"].self {"One"}
print(c3)

我个人会选择选项一,因为trailing结束语法是不必要的语法糖,显然在这里不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.