繁体   English   中英

在Swift中为变量分配Closure会导致“变量在初始化之前使用”

[英]Assigning Closure to variable in Swift causes 'variable used before being initialized'

我有一个闭合问题,该闭合是要创建的,然后在图像的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)
}

在确定编译器已初始化之前,可以使用变量closure 您可以根据需要通过两种方式解决此问题:

  • 在添加else -clause你如果和设置closure为默认关闭。
  • 通过将closure定义为var closure: ((i: Int, j: Int) -> Int)?使closure可选var closure: ((i: Int, j: Int) -> Int)? 然后可以使用closure?(i, j)来检查它是否是可选的closure?(i, j)或者if let filter = closure { filter(i, j)}

另外,尝试使用更好的变量名,例如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 )时,才会初始化您的关闭。 在另一种情况下,它保持未初始化状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM