将闭包分配给 Swift 中的变量会导致 'variable used before being initialized'
Assigning Closure to variable in Swift causes 'variable used before being initialized'
我有一个闭包的问题,该闭包旨在创建然后在图像的 2D 像素光栅范围内的另一个函数中执行,它基本上应该像这样调用:
filter(i,j) 和 return 基于其参数的值。
我认为这段代码应该可以工作,但它抱怨说我创建的闭包变量没有初始化。我想这意味着我没有给它参数,但我不会在这个函数中,因为数据在与图像交互时是闭包已知的。我如何设置一个不关心初始化的闭包?
提前谢谢你:)
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)
}
您在编译器确定它已被初始化之前使用了变量closure
。您可以通过两种方式解决此问题,具体取决于您的需要:
- 将
else
子句添加到您的 if 并将 closure
设置为默认闭包。
- 通过将
closure
定义为 var closure: ((i: Int, j: Int) -> Int)?
使 closure
可选,然后您可以在使用 closure?(i, j)
或 if let filter = closure { filter(i, j)}
.[=26 之前检查它是否可选=]
另外,尽量使用更好的变量名,例如filterClosure
。 closure
其本身并没有真正说明什么。
问题是您将闭包定义为:
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)
}
}
您的闭包只有在代码进入您的 if
块时才会初始化(即如果 type == FilterType.MyFilter
)。在另一种情况下,它未初始化。
我有一个闭包的问题,该闭包旨在创建然后在图像的 2D 像素光栅范围内的另一个函数中执行,它基本上应该像这样调用: filter(i,j) 和 return 基于其参数的值。 我认为这段代码应该可以工作,但它抱怨说我创建的闭包变量没有初始化。我想这意味着我没有给它参数,但我不会在这个函数中,因为数据在与图像交互时是闭包已知的。我如何设置一个不关心初始化的闭包?
提前谢谢你:)
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)
}
您在编译器确定它已被初始化之前使用了变量closure
。您可以通过两种方式解决此问题,具体取决于您的需要:
- 将
else
子句添加到您的 if 并将closure
设置为默认闭包。 - 通过将
closure
定义为var closure: ((i: Int, j: Int) -> Int)?
使closure
可选,然后您可以在使用closure?(i, j)
或if let filter = closure { filter(i, j)}
.[=26 之前检查它是否可选=]
另外,尽量使用更好的变量名,例如filterClosure
。 closure
其本身并没有真正说明什么。
问题是您将闭包定义为:
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)
}
}
您的闭包只有在代码进入您的 if
块时才会初始化(即如果 type == FilterType.MyFilter
)。在另一种情况下,它未初始化。