You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 13:24:22