我有一个关闭的问题,这个关闭意味着要创建,然后在图像的2D像素栅格范围内的另一个函数中执行,它基本上会像这样调用: filter(i,j)并根据其参数返回一个值。 我认为这段代码应该可以工作,但它抱怨我创建的闭包变量没有初始化。我想这意味着我没有给它参数,但我不会在这个函数中,因为当它与图像交互时,闭包知道数据。如何设置一个不关心初始化的闭包?
提前谢谢你:)
func processFilter(type:FilterType){
var x = 0
var y = 0
//create cloure
var closure:(i:Int, j:Int)->Int
if(type == FilterType.MyFilter) {
x = 1024
y = 2048
func filter(i:Int, j:Int)->Int {
return i*j*x*y*4096
}
//compiler does not complain here...
closure = filter
}
//other if statements with different closure definitions follow...
//This call throws error: variable used before being initialized
let image = filterImage(closure)
}
答案 0 :(得分:1)
在编译器确定它已初始化之前,您使用变量closure
。您可以通过两种方式解决此问题,具体取决于您的需求:
else
- 子句,并将closure
设置为默认闭包。closure
定义为var closure: ((i: Int, j: Int) -> Int)?
,使closure?(i, j)
成为可选项,然后您可以在使用if let filter = closure { filter(i, j)}
或filterClosure
之前检查它是否为可选项。另外,尝试使用更好的变量名称,例如closure
。 {{1}}本身并没有真正说出来。
答案 1 :(得分:1)
问题是您将闭包定义为:
var closure:(i:Int, j:Int)->Int
然后,只有在您输入if
时才初始化如果没有,则该var未初始化,因此编译器警告
可能的解决方案:
func processFilter(type:FilterType){
var x = 0
var y = 0
//create cloure
var filterClosure:((i:Int, j:Int)->Int)?
if(type == FilterType.MyFilter) {
x = 1024
y = 2048
func filter(i:Int, j:Int)->Int {
return i*j*x*y*4096
}
//compiler does not complain here...
filterClosure = filter
}
//other if statements with different closure definitions follow...
if let closure = filterClosure {
let image = filterImage(closure)
}
}
答案 2 :(得分:0)
只有在代码进入if
块时(例如type == FilterType.MyFilter
),才会初始化您的闭包。在另一种情况下,它是未初始化的。