Swift中如何将主应用的Colors结构体传入Swift Package并正确访问其嵌套静态成员?
解决Swift Package访问主应用静态嵌套结构体的问题
嘿,你碰到的这个编译器报错其实很好理解:General是Colors的静态嵌套结构体,它的所有成员都属于Colors这个类型本身,而不是Colors的实例对象。你现在把Colors()创建的实例传给Package的方法,自然没法通过实例去访问属于类型的静态成员啦。
下面给你几个符合需求的解决方案,你可以根据自己的情况选择:
方案一:直接传递类型而非实例(最省事,无需改动现有Colors结构)
既然我们要访问的是静态成员,根本不需要创建Colors的实例,直接把Colors类型传给Package就行:
先修改Package里的函数,参数类型改成Colors.Type:
func setupContent(withMainStructType mainStructType: Colors.Type) { print(mainStructType.General.mainColor) }
然后在主应用里调用的时候,直接传Colors.self(代表Colors这个类型本身):
cell.setupContent(withMainStructType: Colors.self)
这个方案完全不用改动你现有的Colors结构体,直接就能解决问题。
方案二:调整Colors结构,让实例能访问颜色成员
如果你更倾向于传递实例,可以把General从静态嵌套结构体改成实例成员:
struct Colors { // 去掉static,改成实例属性 let general = General() struct General { let mainColor = "5F8E3F".toColor } }
然后修改Package里的函数,访问实例的general属性:
func setupContent(withMainStruct mainStruct: Colors) { print(mainStruct.general.mainColor) }
这样原来的调用代码就能正常工作了:
let mainStruct = Colors() cell.setupContent(withMainStruct: mainStruct)
方案三:用协议抽象(解耦Package和主应用的依赖,扩展性更强)
如果希望你的Package不直接依赖主应用的Colors结构体(比如以后可能换别的颜色管理方式),可以用协议来抽象颜色接口:
首先在Package里定义一个协议:
import UIKit protocol AppColorProviding { static var generalMainColor: UIColor { get } }
然后让主应用的Colors遵循这个协议:
struct Colors: AppColorProviding { struct General { static let mainColor = "5F8E3F".toColor } // 实现协议要求的属性 static var generalMainColor: UIColor { General.mainColor } }
Package的函数改成接收遵循协议的类型:
func setupContent<ColorProvider: AppColorProviding>(with colorProvider: ColorProvider.Type) { print(ColorProvider.generalMainColor) }
调用的时候还是传Colors.self:
cell.setupContent(with: Colors.self)
这种方式的好处是,以后主应用哪怕修改Colors的内部结构,只要保持协议的实现,Package的代码完全不用动,耦合度更低。
内容的提问来源于stack exchange,提问作者poPaTheGuru
相关产品推荐
相关产品推荐

