Swift 使用闭包初始化结构

标签 swift closures init

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

最佳答案

传递给构造函数的闭包修改给定的参数, 因此它必须有一个inout-parameter 并用&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

关于Swift 使用闭包初始化结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31071295/

相关文章:

ios - 从 UIAlertView 文本字段获取文本的问题

iOS Swift popToViewController 按名称

closures - 如何命名产生闭包的函数

javascript - React Native 最小/准系统设置

ios - 升级到 El-Capitan 后 Swift 编译器错误

ios - Xcode 8 swift 3 从 URL 加载图像并将其传递到 segue 目的地

java - Java 中的闭包将如何替换/增强接口(interface)?

swift - 在其构造函数中创建带有闭包的成员变量

__init__ 类中的 Python 函数指针

python - 如何防止在 __init__() python 中创建对象