【发布时间】:2019-08-26 06:41:37
【问题描述】:
使用 Xcode 11 beta 6,我正在尝试为具有使用 @Published 的属性的类型声明一个协议(但这个问题可以推广到 任何 PropertyWrapper I猜)。
final class DefaultWelcomeViewModel: WelcomeViewModel & ObservableObject {
@Published var hasAgreedToTermsAndConditions = false
}
我尝试声明:
protocol WelcomeViewModel {
@Published var hasAgreedToTermsAndConditions: Bool { get }
}
导致编译错误:Property 'hasAgreedToTermsAndConditions' declared inside a protocol cannot have a wrapper
所以我试着把它改成:
protocol WelcomeViewModel {
var hasAgreedToTermsAndConditions: Published<Bool> { get }
}
正在尝试
哪个不能编译,DefaultWelcomeViewModel does not conform to protocol,好吧,嗯,我不能用Published<Bool>,那我们试试吧!
struct WelcomeScreen<ViewModel> where ViewModel: WelcomeViewModel & ObservableObject {
@EnvironmentObject private var viewModel: ViewModel
var body: some View {
// Compilation error: `Cannot convert value of type 'Published<Bool>' to expected argument type 'Binding<Bool>'`
Toggle(isOn: viewModel.hasAgreedToTermsAndConditions) {
Text("I agree to the terms and conditions")
}
}
}
// MARK: - ViewModel
protocol WelcomeViewModel {
var hasAgreedToTermsAndConditions: Published<Bool> { get }
}
final class DefaultWelcomeViewModel: WelcomeViewModel & ObservableObject {
var hasAgreedToTermsAndConditions = Published<Bool>(initialValue: false)
}
这会导致Toggle:Cannot convert value of type 'Published<Bool>' to expected argument type 'Binding<Bool>'上的编译错误。
问题:如何使用 PropertyWrappers 为具体类型的属性创建协议属性?
【问题讨论】:
-
再次阅读我的问题:)
-
这个问题可能应该被标记为该问题的重复。但问题是提供更多背景信息。太糟糕了,我们没有真正“到达那里”,所以无法编译?
-
是的,我虽然关闭为重复但不希望您的 cmets “丢失”。也许如果您移动它们作为对另一个问题的答复,我们可以关闭这个。无论如何,我确实尝试了不同的访问类型,但也许我遗漏了一些东西。请自己试一试并发布您的结果(如果有的话;-)。干杯。