使用 Published var 通过 Combine 观察 Publisher 中的 switch case

Using a Published var to observe a switch case in a Publisher with Combine

我有一个 enum 案例,它是 ObservableObject class 中的 @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
}()

目前,您的 annualRate { } 中没有 return 语句。您有两个语句——一个定义 output,第二个创建发布者。如果你只有 one 语句,它会被认为是隐式的 return 而你不会有错误。

我认为您可以稍微重构并摆脱 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 { [=10=] * 0.01 }
        .eraseToAnyPublisher()
}()

现在,只有 一个 语句,它被认为是隐式 return 并且没有任何未使用的。