Swift中签名相同时如何指定使用特定初始化器?
Swift编译器遇到Item()时会优先匹配无参的init(),没法直接通过Item()这种写法指定调用带默认参数的那个初始化器,但有几种实用办法能达到你的需求:
方法一:用静态工厂方法包装(最接近你的预期)
给结构体新增一个静态方法,内部调用带默认参数的初始化器,这样就能像调用「Item-2()」一样直接获取目标实例:
struct Item { var isAvailable: Bool var count: Int init() { self.isAvailable = false self.count = 0 } init(isAvailable: Bool = true, count: Int = 100) { self.isAvailable = isAvailable self.count = count } // 自定义静态方法,对应你想要的「Item-2()」效果 static func standard() -> Item { // 显式调用带默认参数的初始化器,避免歧义 return self.init(isAvailable: , count: ) } } // 调用示例 let defaultUnavailable = Item() // 结果:Item(isAvailable: false, count: 0) let defaultAvailable = Item.standard() // 结果:Item(isAvailable: true, count: 100)
方法二:调整初始化器结构(更符合Swift设计习惯)
删掉无参的init(),把两种默认实例都通过工厂方法提供,从根源上避免初始化器歧义:
struct Item { var isAvailable: Bool var count: Int // 保留带默认参数的初始化器作为基础 init(isAvailable: Bool = true, count: Int = 100) { self.isAvailable = isAvailable self.count = count } // 专门提供创建"不可用默认实例"的方法 static func unavailable() -> Item { return Item(isAvailable: false, count: 0) } } // 调用示例 let defaultAvailable = Item() // 直接得到(isAvailable: true, count: 100) let defaultUnavailable = Item.unavailable() // 得到原来无参init的结果
方法三:显式指定参数标签(不推荐)
如果不想修改结构体代码,也可以通过显式写参数标签来调用带默认参数的初始化器(哪怕不传值),但这种写法不够直观,需要记住参数标签:
let defaultAvailable = Item(isAvailable: , count: )
内容的提问来源于stack exchange,提问作者aheze
相关产品推荐
相关产品推荐

