我一直在为这个问题而苦苦挣扎
我正在尝试在 Swift 上创建一个绑定结构,以简单的方式绑定 viewModel 和控制器。因此,我创建了一个协议,该协议定义了要存储在控制器上的变量。
protocol DVA_MOVVER_ViewControllerProtocolDelegate {
associatedtype delegateType : DVA_MOVVER_ViewModelProtocol
var dva_viewModelDelegate : delegateType? { get set }
}
如您所见,该变量被限制为满足另一个协议,即这个协议:
protocol DVA_MOVVER_ViewControllerProtocol {
func dva_tellViewModel()
// Some other methods
}
我希望控制器类只实现变量,所以它可以是一个存储的变量。我无法使用扩展来完成此操作。
因此,我有一个第二个协议的扩展来实现绑定并创建一个通用方法将变量绑定到控制器
extension DVA_MOVVER_ViewControllerProtocol where Self:DVA_MOVVER_ViewControllerProtocolDelegate {
mutating func dva_bindViewModel<T:DVA_MOVVER_ViewModelProtocol>(parameter:T) {
typealias delegateType = T
self.dva_viewModelDelegate = parameter
}
...
// The rest of the DVA_MOVVER_ViewControllerProtocol methods
}
这就是我陷入困境的地方。编译器说"无法将类型'T'的值分配给类型'_?'"。我认为这可能是因为它无法在编译时解析参数类型,但我不知道如何解决这个问题......
如@rbarbera所述,在这种情况下,键入擦除是要走的路:
https://realm.io/news/type-erased-wrappers-in-swift/