理解swift Dictionary语法

时间:2018-05-06 17:44:35

标签: swift

我使用遗留代码,我找到以下代码:

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?) -> ()) -> ()

1 个答案:

答案 0 :(得分:2)

String是一组字符。

String?表示与Optional<String>相同,因此它是Optional.noneOptional.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