Combine中使用@Published观察枚举case并修复eraseToAnyPublisher警告
问题核心原因
annualRate的初始化闭包存在多条语句(第一行提前声明了var output: Double变量),无法触发Swift的单表达式隐式返回规则,你没有显式返回最终生成的AnyPublisher实例,导致eraseToAnyPublisher()的返回值被丢弃,触发未使用结果的警告- 存在笔误:枚举定义的名称是
MortgageType,但term变量声明的类型是MortgageTerm,需要先修正命名一致的问题
修复代码
修正后的annualRate定义如下:
public lazy var annualRate: AnyPublisher<Double, Never> = { $term .map { [weak self] switchCase -> Double in guard let self = self else { return 0 } let output: Double switch switchCase { case .tenYear: output = self.rates.tenYearFix case .fifteenYear: output = self.rates.fifteenYearFix case .twentyYear: output = self.rates.twentyYearFix case .thirtyYear: output = self.rates.thirtyYearFix } return output * 0.01 } .eraseToAnyPublisher() }()
优化说明
上述代码中新增了[weak self]修饰符,避免闭包对ObservableObject实例产生强引用导致内存泄漏,同时把output变量的声明移到了map闭包内部,移除了初始化闭包中的多余语句,直接返回Publisher链式调用的最终结果即可解决警告。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

