【发布时间】:2018-12-16 04:32:45
【问题描述】:
您好,我是 swift 和编写 iOS 应用程序的新手。 我想知道如何更好地使用泛型来传递我的结果数据。
我有一个代表从服务器提供人员数据
protocol PersonDataProvider {
func dataReceived(_ result: PersonResult)
}
结果通过枚举可以有成功和失败状态。
enum PersonResult {
case success
case networkFailed
}
下面的类调用服务器api并获取数据,传回
class MyNetworkClass {
var personDataProvider: PersonDataProvider
func getDataFromServer() {
personDataProvider.dataReceived(.success)
}
}
下面是我订阅提供者的视图控制器
class MyViewController: PersonDataProvider {
func dataReceived(_ result: PersonResult) {
switch result {
case .success:
print("success")
case .networkFailed:
print("no network")
}
}
}
现在,我想发送带有成功块的额外信息,可以像下面的数据模型一样。它可以有任何类型。
class Employer:Person {
let id
let salary
}
class Student:Person {
let id
let rollNumber
}
我怎样才能做到这一点?我可以在协议中定义关联类型并实现如果是的话如何?
我如何订阅“PersonDataProvider”的“MyViewController”才能定义他期望从“成功”块获得的结果类型?
【问题讨论】:
-
您认为为什么会涉及到 generics?您在代码中的什么位置“发送”“成功块”?
-
"getDataFromServer" 调用委托方法。那是我想通过成功块根据要求将“雇主”或“学生”数据作为参数传递的地方。我不确定如何实现它。我还希望“MyNetworkClass”在订阅时通过“PersonDataProvider”定义他想要的类型数据
-
好的,Employer 和 Student 可以有一个共同的超类吗?因此,成功可能有一个关联的值,可能是其中之一。
-
@matt 是的,它可以有。在这种情况下如何使用关联值?