2015-04-21 31 views
0

我有一個閉包的問題,​​它意味着要創建,然後在另一個函數內部在圖像的2D像素柵格範圍內執行基本上這樣調用: filter(i,j)並返回一個基於它的參數的值。 我認爲這個代碼應該可以工作,但它抱怨我創建的閉包變量沒有初始化。我想這意味着我沒有給出它的參數,但是我不會在這個函數內,因爲數據在它與圖像交互時被閉包知道。我如何設置一個不關心初始化的閉包?將Swift中的變量賦值給變量導致'被初始化之前使用的變量'

預先感謝您:)

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) 
} 

回答

1

您使用變量closure前的編譯器肯定的是,它被初始化。您可以通過兩種方式,解決這個取決於你需要什麼:

  • 添加else -clause你如果和設置closure爲默認關閉。
  • 通過將closure定義爲var closure: ((i: Int, j: Int) -> Int)?,然後在使用closure?(i, j)if let filter = closure { filter(i, j)}之前檢查它是否可選。

此外,請嘗試使用更好的變量名稱,如。 closure本身並不真正多說。

+1

謝謝您的回答!我想將閉包設置爲零,這是編譯器也不接受的默認值,我想阻止默認閉包。然而,使用可選項似乎是一種優雅的方式!變量名稱僅用於上述示例,但確實可能更有意義。 – Kryptographique

1

的問題是,你定義封口:

var closure:(i:Int, j:Int)->Int 

然後你初始化只有當你進入,如果

如果不是,那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) 
    } 
} 
+0

您的封閉現在返回一個可選類型,您應該使用括號。 – vrwim

+0

是的!謝謝,錯字!另外:我已經調用了關於命名閉包'filterClosure'的建議 –

0

如果代碼輸入您的if區塊,您的封閉只會被初始化。如果是type == FilterType.MyFilter)。在另一種情況下,它未被初始化。