【问题标题】:Use Struct as a parameter in a function in Swift在 Swift 的函数中使用 Struct 作为参数
【发布时间】:2021-11-09 06:09:39
【问题描述】:

我有下一个场景

我创建了一个Swift package,我在main application 中使用它。在这个Swift Package 中,我想使用一些颜色,因为它是UI package。我的struct Colors 已经是defined in my main application,我不想在package 中再次定义它,所以我想将我的struct Colors 发送到package

我的struct Colors 里面还有另一个struct General,比如:

struct Colors {
     struct General {
          static let mainColor = "5F8E3F".toColor
     }
}

这就是我在package 中的称呼:

func setupContent(withMainStruct mainStruct: Colors) {
    print(mainStruct.General.mainColor)
}

这是我从main application发送的方式:

let mainStruct = ColorStruct()
cell.setupContent(withMainStruct: mainStruct)

我的主要问题是:

Static member 'General' cannot be used on instance of type 'Colors'

有什么办法吗?

我想要的只是使用结构的值,我不需要更新它。

【问题讨论】:

  • 为什么不简单地使用Colors.General.mainColor 为什么还要首先创建一个Colors 实例呢?错误很明显,你不能从实例访问静态属性,所以避免它,直接通过Colors.General.mainColor 访问它我不太确定你的用例,但看看结构嵌套的方式和静态让似乎你可以采取更好的方法:|
  • 我已经编辑了帖子,说明了我如何发送它以及如何调用它,因为我希望在我的package 中使用该结构以及从main application 发送的值跨度>
  • 如果需要作为值发送,需要一直是值,即Colors必须有General类型的属性。也就是说,感觉应该有更好的解决方案,更符合第一条评论。

标签: swift static swift-structs


【解决方案1】:

听起来您想在您的包中定义一个协议,该协议由您的应用程序中的结构实现。因此,您只需将这些预定义的值提供给包即可。

所以是这样的。

在应用中:

struct AppColors: Colors {
    let general: GeneralColors = General()

    struct General: GeneralColors {
        let mainColor = UIColor.blue
     }
}

configLib(colors: AppColors())

包装内

protocol Colors {
    var general: GeneralColors { get }
}

protocol GeneralColors {
    var mainColor: UIColor { get }
}

func configLib(colors: Colors) {
    print(colors.general.mainColor)
}

【讨论】:

  • func configLib(colors: Colors) { print(colors.general.mainColor) 好的,谢谢,到目前为止一切顺利,但我希望这个颜色对象在我的包中的任何地方都可以使用。我应该如何以及在哪里声明颜色对象的实例?但请记住,我希望在没有 !或者 ?或默认值。我想像这个函数的参数一样声明,但在项目中全局可见
  • 我认为这是不可能的。如果您不想要可选项,则至少需要默认值。但是对于我的包,我通常会在包中为我的 DI 对象定义一个强制解包的全局变量。对你来说,它就像public var color: Colors! 并且已经将它填写在 AppDelegate MyPackage.color = AppColors() 中。由于您确保在应用程序启动时对其进行初始化,因此强制展开将不是问题。即使您忘记这样做,您肯定会在开发期间看到崩溃,同时测试组件。所以预计不会出现运行时问题。
  • 感谢您的回答和时间!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多