Swift中能否将两个变量作为多类型别名参数传入?类初始化疑问
问题解答
能不能直接传入PotatoFactory()和CarrotFactory()到类A?
不行。你的Factory类型别名要求单个对象必须同时遵守PotatoFactoryProtocol和CarrotFactoryProtocol两个协议,而PotatoFactory和CarrotFactory是两个独立的实例,各自只实现其中一个协议的话,完全不符合Factory的类型要求,没法直接传入这个初始化方法。
最简洁的传入多个工厂参数的方式
根据不同需求场景,给出以下几种简洁方案:
场景1:需要同时传入不同类型的工厂(土豆+胡萝卜)
直接修改类A的初始化方法,分开接收两个独立的协议参数,这是最直观的方式:
class A { let potatoFactory: PotatoFactoryProtocol let carrotFactory: CarrotFactoryProtocol init(potatoFactory: PotatoFactoryProtocol, carrotFactory: CarrotFactoryProtocol) { self.potatoFactory = potatoFactory self.carrotFactory = carrotFactory } } // 使用示例 let a = A(potatoFactory: PotatoFactory(), carrotFactory: CarrotFactory())
场景2:需要传入多个同类型的工厂(比如多个土豆工厂)
把参数改成数组类型即可:
class A { let potatoFactories: [PotatoFactoryProtocol] init(potatoFactories: [PotatoFactoryProtocol]) { self.potatoFactories = potatoFactories } } // 使用示例 let a = A(potatoFactories: [PotatoFactory(), SpecialPotatoFactory()])
额外场景:一定要保留原有的Factory组合类型
可以创建一个“组合工厂”类,同时持有两个工厂实例并实现两个协议,把方法转发给对应的工厂:
// 定义组合工厂 class CombinedFactory: PotatoFactoryProtocol, CarrotFactoryProtocol { private let potatoFactory: PotatoFactoryProtocol private let carrotFactory: CarrotFactoryProtocol init(potatoFactory: PotatoFactoryProtocol, carrotFactory: CarrotFactoryProtocol) { self.potatoFactory = potatoFactory self.carrotFactory = carrotFactory } // 实现土豆协议方法 func makePotato() -> Potato { potatoFactory.makePotato() } // 实现胡萝卜协议方法 func makeCarrot() -> Carrot { carrotFactory.makeCarrot() } } // 使用示例 let combined = CombinedFactory(potatoFactory: PotatoFactory(), carrotFactory: CarrotFactory()) let a = A(factory: combined)
内容的提问来源于stack exchange,提问作者André
相关产品推荐
相关产品推荐

