2015-06-26 28 views
3
public struct Style { 

    public var test : Int? 

    public init(_ build:(Style) -> Void) { 
     build(self) 
    } 
} 

var s = Style { value in 
    value.test = 1 
} 

在可變斯威夫特初始化結構與閉合

Cannot find an initializer for type 'Style' that accepts an argument list of type '((_) -> _)' 

聲明沒有人知道爲什麼這是不行的給出了一個錯誤,它似乎合法的代碼,我

爲記錄這不會工作,要麼

var s = Style({ value in 
    value.test = 1 
}) 

回答

4

傳遞給構造函數的封閉修改給定參數, 因此必須採取INOUT參數&self被稱爲:

public struct Style { 

    public var test : Int? 

    public init(_ build:(inout Style) -> Void) { 
     build(&self) 
    } 
} 

var s = Style { (inout value : Style) in 
    value.test = 1 
} 

println(s.test) // Optional(1) 

注意,使用self(如build(&self))要求所有 屬性已初始化。這適用於此,因爲可選項 已隱式初始化爲nil。或者你可以定義 該屬性作爲一個非可選的初始值:

public var test : Int = 0 
+0

謝謝,似乎很詳細,但它終於工作 –