定义一个闭包并稍后执行它,swift

define a closure and execute it later on, swift

我正在定义一个包含 2 String 和 return 的块

var editingAssignmentBlock : ((String, String) -> Void)?

我通过这样做成功地执行了块

 guard let block = self.editingAssignmentBlock else
   {
        return
   }
   block("This is a new shift", "This is a new type")
   }

或者,如果我使用 typealias 定义一个块,如下所示

typealias editingAssignmentBlock = ((String, String) -> Void)?

如果我像以前一样使用相同的方式执行块,并且出现如下错误

initializer for conditional binding must have Optional type, not 'editingAssignmentBlock.Type'(aka 'Optional<(String,String) -> ()>.Type')

谁能知道我在使用 typealias 定义块时做错了什么。

这里没有问题。你没有展示你的真实代码,所以谁知道它出了什么问题?但我这样做了,它编译得很好:

typealias MyEditingAssignmentBlock = ((String, String) -> Void)?
var editingAssignmentBlock : MyEditingAssignmentBlock
func test() {
    guard let block = self.editingAssignmentBlock else {return}
    block("hey", "ho")
}

编辑认为 问题是你不明白什么是类型别名。它只是给一个类型一个名字。它定义了一个同义词。它不会为你做任何其他事情。如果你想要一个变量editingAssignmentBlock,你仍然需要将它声明为一个变量(如我的代码)。

换句话说,将类型别名视为一种文本替换形式。当你说

typealias MyEditingAssignmentBlock = ((String, String) -> Void)?

你说的是:"Whenever I write MyEditingAssignmentBlock, substitute ((String, String) -> Void)?"。所以当我说:

typealias MyEditingAssignmentBlock = ((String, String) -> Void)?
var editingAssignmentBlock : MyEditingAssignmentBlock

...即 与执行该替换和说 相同

var editingAssignmentBlock : ((String, String) -> Void)?

但是类型别名 本身 并没有通过某种巫术为你声明 varvar 声明仍然只是一个 var 声明,如果这是您想要的,您仍然需要明确地进行声明。

同样,当 Apple 说 typealias TimeInterval = Double 时,这只是意味着 "From now on, TimeInterval is another word for Double." 它不会导致任何变量神奇地出现。