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

时间:2016-06-28 20:01:31

标签: ios iphone swift2 closures type-alias

我正在定义一个占用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定义块时,任何人都可以知道我做错了什么。

1 个答案:

答案 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)?

但类型别名本身并没有通过某种神奇巫术为你宣告varvar声明仍然只是var声明,如果您想要的话,仍然需要明确说明。

同样,当Apple说typealias TimeInterval = Double时,这只是意味着&#34;从现在开始,TimeInterval是Double的另一个词。&#34;它并没有导致任何变量神奇地存在。