繁体   English   中英

如何为 SwiftUI 中的视图创建两个初始化程序?

[英]How can I create two initializers for a View in SwiftUI?

如何在 SwiftUI 视图(这是一个结构)中创建 2 个初始化程序?

我正在尝试使初始化程序采用标题和颜色以及仅采用标题的初始化程序。

我试图创建便利初始化程序,但似乎 Swift 不允许这样做。

便利初始化器在 SwiftUI 视图中有用吗?

你可以这样做,像这样:

方便初始化器可以在引用类型中访问! 不在值类型中(例如 Struct)!


struct CustomView: View {

    let title: String
    let color: Color

    init(title: String, color: Color) {
        self.title = title
        self.color = color
    }
    
    init(title: String) {
        self.title = title
        self.color = Color.black
    }

    var body: some View {
        
        Text(title)
            .foregroundColor(color)
        
    }
    
}

用例:

struct ContentView: View {

    var body: some View {
        
        CustomView(title: "Hello")
        
        CustomView(title: "Hello", color: Color.red)
        
    }
}
struct CustomView: View {
    var title: String
    var color: Color = .black
    
    var body: some View {
        Text(title)
            .foregroundColor(color)
    }
}

struct FooView: View {
    var body: some View {
        CustomView(title: "Title")
        CustomView(title: "Hello", color: .red)
    }
}

Swift 默认合成成员初始化器。 这意味着您将获得一个初始化器,它免费接受每个结构属性的值。 您不必手动编写一个。 如果任何属性具有默认值,生成的初始化程序将使用这些作为 arguments 的默认值。

如果您想要自己的初始化程序并且想要保留生成的初始化程序,请在类型的扩展中编写自己的初始化程序。

更新:正如 swiftPunk 所指出的,这并没有给你两个初始化函数,所以如果你需要这样做:

struct CustomView: View {
    let title: String
    var color: Color = .black
    
    var body: some View {
        Text(title)
            .foregroundColor(color)
    }
}

extension CustomView {
    init(title: String) {
        self.title = title
    }
}

现在您实际上有两个实际功能可以在需要时使用(也许您想组合它们或其他东西)

let f1 = CustomView.init(title:)
let f2 = CustomView.init(title:color:)

如果你愿意,你可以用 title let代替var ,但是视图结构总是会被重新计算。

暂无
暂无

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

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