定义一个闭包并稍后执行它,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)?
但是类型别名 本身 并没有通过某种巫术为你声明 var
。 var
声明仍然只是一个 var
声明,如果这是您想要的,您仍然需要明确地进行声明。
同样,当 Apple 说 typealias TimeInterval = Double
时,这只是意味着 "From now on, TimeInterval is another word for Double." 它不会导致任何变量神奇地出现。
我正在定义一个包含 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)?
但是类型别名 本身 并没有通过某种巫术为你声明 var
。 var
声明仍然只是一个 var
声明,如果这是您想要的,您仍然需要明确地进行声明。
同样,当 Apple 说 typealias TimeInterval = Double
时,这只是意味着 "From now on, TimeInterval is another word for Double." 它不会导致任何变量神奇地出现。