我正在定义一个占用2 String
并且不返回任何内容的块
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
定义块时,任何人都可以知道我做错了什么。
答案 0 :(得分:2)
这里没问题。你没有显示你的真实代码,所以谁知道它有什么问题呢?但我做到了这一点,它编译得很好:
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)?
你说:&#34;每当我写MyEditingAssignmentBlock
时,请替换((String, String) -> Void)?
&#34;。所以当我说:
typealias MyEditingAssignmentBlock = ((String, String) -> Void)?
var editingAssignmentBlock : MyEditingAssignmentBlock
... 与执行该替换相同并说:
var editingAssignmentBlock : ((String, String) -> Void)?
但类型别名本身并没有通过某种神奇巫术为你宣告var
。 var
声明仍然只是var
声明,如果您想要的话,仍然需要明确说明。
同样,当Apple说typealias TimeInterval = Double
时,这只是意味着&#34;从现在开始,TimeInterval是Double的另一个词。&#34;它并没有导致任何变量神奇地存在。