使用 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 并且没有任何未使用的。
我有一个 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 并且没有任何未使用的。