【问题标题】:Using a Published var to observe a switch case in a Publisher with Combine使用 Published var 观察带有 Combine 的 Publisher 中的 switch case
【发布时间】:2021-09-21 01:50:07
【问题描述】:

我有一个 enum 案例,它是 ObservableObject 类中的 @Published var。我要做的是观察下面定义的term var 的变化并更新annualRate 发布者。

下面是@Published var

@Published var term: MortgageTerm = .thirtyYear

MortgageTerm 枚举定义如下:

public enum MortgageType: Int, CaseIterable {
    case tenYear     = 10
    case fifteenYear = 15
    case twentyYear  = 20
    case thirtyYear  = 30
}

我正在尝试定义这个annualRate,以便它观察到上面term var 的变化:

public lazy var annualRate: AnyPublisher<Double, Never> = {
    var output: Double
    $term
        .map { switchCase -> Double in
            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
        }
        // FIXME: Result of call to `eraseToAnyPublisher()` is unused
        .eraseToAnyPublisher()
}()

我在.eraseToAnyPublisher() 的线路上收到此警告。我在搞砸什么,我该如何解决?

这是rates 的来源:

private lazy var rates: AverageRate = {
    let rateMock = AverageRate(thirtyYearFha: 2.873,
                                thirtyYearVa: 2.858,
                                tenYearFix: 2.068,
                                fifteenYearFix: 2.358,
                                thirtyYearFix: 3.054,
                                fiveOneArm: 2.898,
                                sevenOneArm: 2.972,
                                twentyYearFix: 2.756)
    
    return rateMock
}()

【问题讨论】:

    标签: swift enums combine publisher


    【解决方案1】:

    现在,您的 annualRate { } 中没有 return 语句。您有两个语句——一个定义output,第二个创建发布者。如果您只有 一个 语句,它将被视为隐式返回并且您不会有错误。

    我认为您可以非常轻微地重构并摆脱var output,因为每个值都被修改了相同的数量。所以,你可以添加另一个map

    public lazy var annualRate: AnyPublisher<Double, Never> = {
        $term
            .map { switchCase -> Double in
                switch switchCase {
                case .tenYear:
                    return self.rates.tenYearFix
                case .fifteenYear:
                    return self.rates.fifteenYearFix
                case .twentyYear:
                    return self.rates.twentyYearFix
                case .thirtyYear:
                    return self.rates.thirtyYearFix
                }
            }
            .map { $0 * 0.01 }
            .eraseToAnyPublisher()
    }()
    

    现在,只有 一个 语句,它被认为是隐式返回,没有任何东西是未使用的。

    【讨论】:

    • 非常感谢!我一直在摆弄这个比我今天愿意承认的时间更长。我需要习惯Combine的做事方式
    • 没问题。您也可以移动map 闭包的var output inside,但我认为只做第二个map 有点Swift-ier。隐式返回不是 Combine 特定的,而是一个更新的 Swift 特性。
    猜你喜欢
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多