我使用遗留代码,我找到以下代码:
let actions = [PrinterReportType.z: {
printer.printZReport($0)
DeviceFabric.lifehubTerminal().reconciliation()
}, .x: printer.printXReport, .openSession: printer.openSession}]
“动作”声明如下:
let actions: [PrinterReportsModel.PrinterReportType : ((String?) -> ()) -> ()]
Key是枚举值,但我无法弄清楚这里有什么价值。
我有新的枚举类型PrinterReportsModel.PrinterReportType
,我只是想为该词典添加新值。我想这是某种功能。所以,我想声明这个功能,在这里添加它,但我无法弄清楚如何。而且我无法弄清楚wha类型是 - ((String?) -> ()) -> ()
答案 0 :(得分:2)
String
是一组字符。
String?
表示与Optional<String>
相同,因此它是Optional.none
或Optional.some(String)
。
(String?) -> ()
是一个函数,它接受String?
并且不返回任何内容(()
也称为Void
,零元素元组。我们将其称为 String?
- 消费者:它需要String?
并使用 。也许它只会抛出String?
。也许它打印出来。也许它将String?
存储在变量或数据库中,或通过网络发送。
你可以像这样定义一个String?
- 消费者关闭:
let action: (String?) -> () = { (_ s: String?) -> () in
print(s ?? "(none)")
}
(我完全指定了上面的类型,但你可以省略一些类型,让编译器推断它们。)
你可以像这样定义一个String?
- 消费者函数:
func test(_ s: String?) -> () { print(s ?? "(none)" }
并像这样传递:
let action: (String?) -> () = test
您可以在类(或结构)中定义String?
- 使用者方法,如下所示:
class MyObject {
func test(_ s: String?) -> () { print(s ?? "(none)") }
}
并像这样传递:
let myObject = MyObject()
let action: (String?) -> () = myObject.test
((String?) -> ()) -> ()
是一个接受String?
消费者并且不返回任何内容的函数。您可以将此视为String?
- 消费者 - 消费者。也许它会抛弃String?
- 消费者。也许它会将String?
- 使用者存储在变量中以供日后使用。也许它会为某个字符串数组中的每个元素调用String?
- 消费者一次,或十次或一次。也许它会每秒安排一次对String?
- 消费者的调用,直到程序退出。
您可以定义String?
- 消费者 - 消费者关闭,如下所示:
let action: ((String?) -> ()) -> () = { (_ sc: (String?) -> ()) -> () in
sc("hello")
sc(nil)
sc("world")
}
您可以像这样调用闭包:
action({ (_ s: String?) -> () in print(s ?? "(none)")}
或者像这样:
let printString: (String?) -> () = { print($0) }
action(printString)
您可以像这样定义String?
- 消费者 - 消费者功能:
func test(_ sc: (String?) -> ()) -> () {
sc("hello")
sc(nil)
sc("world")
}
并像这样传递:
let action: ((String?) -> ()) -> () = test
您可以在类(或结构)中定义String?
- 使用者 - 消费者方法,如下所示:
class MyObject {
func test(_ sc: (String?) -> ()) -> () {
sc("hello")
sc(nil)
sc("world")
}
}
并像这样传递:
let myObject = MyObject()
let action: ((String?) -> ()) -> () = myObject.test