SwiftUI 视图和 Swift 包管理器

Ste*_*nch 3 swift-package-manager swiftui

我正在尝试创建一个基本上是单个 SwiftUI 视图的 Swift 包。我在这里创建了一个示例来显示正在发生的事情。打包做什么,并不重要,我只是在视图中包含了一些 @State 和 @Binding 变量,这样我就会得到与我在真实包中得到的相同的错误。视图结构是这样的。

import SwiftUI

public struct SampleView: View {
    @Binding var myNum:Int
    @State var fixedText:String = ""
    var myText = ""
    var optional: String?


   public  var body: some View {
        VStack {
            if optional != nil {
                Text(optional!)
            }
            Text(myText)
            Text("Parent number: \(myNum)")
            Text("\(fixedText)")
            Button("Increment num") {
                self.myNum += 1
            }.foregroundColor(.blue)
            Button("Change Parent Text") {
                self.fixedText = "Only Changes Child"
            }.foregroundColor(.blue)
        }.background(Color.red)
            .foregroundColor(.white)
    }
}
Run Code Online (Sandbox Code Playgroud)

当我添加包并将其导入到我的项目中的一个视图中时,如果视图不是 Swift 包的一部分,我应该能够像这样使用 Do like this:

 SampleView(myNum: $myNum,
             fixedText: parentText,
             myText: "Display Text Passed from parent")
Run Code Online (Sandbox Code Playgroud)

但是,我没有完成代码并收到错误消息:

'SampleView' initializer is inaccessible due to 'internal' protection level
Run Code Online (Sandbox Code Playgroud)

我在 SampeView 结构上尝试了各种初始化,但不断收到各种不同的错误。我只是不明白如何在这里修复访问级别。任何人都可以帮忙吗?截图也在这里。 在此处输入图片说明

Asp*_*eri 8

这是 Package 中的预期声明(使用 Xcode 11.2.1 / iOS 13.2.2 测试)。请注意,@State不允许在 View 之外使用,因此您需要通过以下方式进行同步Binding

public struct SampleView: View {
    @Binding var myNum:Int
    @Binding var fixedText:String
    var myText: String
    var optional: String?

    public init(myNum: Binding<Int>, fixedText: Binding<String>, 
                myText: String = "", optional: String? = nil) {
        self._myNum = myNum
        self._fixedText = fixedText
        self.myText = myText
        self.optional = optional
    }

    public var body: some View {
        VStack {
            if optional != nil {
                Text(optional!)
            }
            Text(myText)
            Text("Parent number: \(myNum)")
            Text("\(fixedText)")
            Button("Increment num") {
                self.myNum += 1
            }.foregroundColor(.blue)
            Button("Change Parent Text") {
                self.fixedText = "Only Changes Child"
            }.foregroundColor(.blue)
        }.background(Color.red)
            .foregroundColor(.white)
    }
}
Run Code Online (Sandbox Code Playgroud)

和用法:

@State private var myNum: Int = 1
@State private var parentText = "Test"
var body: some View {
    SampleView(myNum: $myNum,
               fixedText: $parentText,
               myText: "Display Text Passed from parent")
}
Run Code Online (Sandbox Code Playgroud)