Swift中如何创建多参数版本同名函数 避免逻辑代码重复
实现方式
你不需要在多个同名重载函数里重复编写逻辑,有两种非常成熟的写法可以实现需求,完全避免代码冗余。
方案1:给可选参数设置默认值(优先推荐)
这是Swift原生支持的语法特性,你不需要单独定义两个函数,只需要给sameAs参数设置默认值nil,就能同时支持两种参数个数的调用形式:
static func canUserRefreshApi( lastTimeUserRefreshedApiUserDefault: String, compareTo: DateComparison, sameAs: Date? = nil // 直接在这里设置默认值 ) -> Bool { // 所有核心逻辑只需要写这一份 // 内部逻辑里判断sameAs是否为nil,分别处理两种调用场景的分支即可 return whateverResult }
写好之后两种调用方式都能正常运行:
// 两参数调用,编译器会自动补全sameAs: nil canUserRefreshApi(lastTimeUserRefreshedApiUserDefault: "record_key", compareTo: .day) // 三参数调用 canUserRefreshApi(lastTimeUserRefreshedApiUserDefault: "record_key", compareTo: .day, sameAs: targetDate)
方案2:重载时让短参数方法调用全参数方法
如果你的场景不适合用默认参数(比如两参数版本的sameAs默认值需要复杂计算才能得到),确实需要写两个独立的重载函数时,不要复制粘贴核心逻辑,遵循「核心逻辑只放在参数最完整的方法里」的原则即可:
// 全参数版本:存放所有核心业务逻辑 static func canUserRefreshApi(lastTimeUserRefreshedApiUserDefault: String, compareTo: DateComparison, sameAs: Date?) -> Bool { // 核心逻辑只写在这里 return whateverResult } // 两参数重载版本:只做参数适配,不写重复逻辑 static func canUserRefreshApi(lastTimeUserRefreshedApiUserDefault: String, compareTo: DateComparison) -> Bool { // 在这里计算好两参数场景下sameAs对应的默认值,直接调用全参数版本 let defaultSameAs = Date() // 替换成你实际需要的默认逻辑 return canUserRefreshApi( lastTimeUserRefreshedApiUserDefault: lastTimeUserRefreshedApiUserDefault, compareTo: compareTo, sameAs: defaultSameAs ) }
你举的multi函数示例也可以用同样的方式实现,完全不会有代码重复:
// 全参数版本写核心逻辑 func multi(acceptsA: String, acceptsB: String) { // 业务逻辑 } // 单参数版本直接调用双参数版本,传入默认值 func multi(acceptsA: String) { multi(acceptsA: acceptsA, acceptsB: "default_value") }
注意:不要在多个重载方法里复制粘贴相同的逻辑代码,否则后续修改需求时很容易漏改某一个版本,导致逻辑不一致。所有重载版本最终都应该调用同一个包含完整逻辑的方法,把代码冗余降到最低。
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

