嗨,我是新手使用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”如何定义他期望从“成功”块中得到的结果类型?
发布于 2018-12-16 13:18:56
使用关联值作为.success
案例的一部分。
假设你有一个超类的人适合你的类型的人。然后像这样定义你的枚举:
enum PersonResult {
case success(Person)
case networkFailed
}
现在,当您返回一个.success
值时,您必须提供一个Person来使用它:
func getDataFromServer() {
let person = Student.init(...) // initialize, or fetch, or whatever
personDataProvider.dataReceived(.success(person))
}
这是一个完整的假例子,模拟了整个过程;你必须改变细节,但重点是,这是编译的:
enum PersonResult {
case success(Person)
case networkFailed
}
protocol PersonDataProvider {
func dataReceived(_ result: PersonResult)
}
class MyNetworkClass {
var personDataProvider: PersonDataProvider!
func getDataFromServer() {
let person = Student.init(id: 3, rollNumber: 10)
personDataProvider.dataReceived(.success(person))
}
}
class Person {}
class Employer:Person {
let id : Int
let salary : Int
init(id:Int, salary:Int) {
self.id = id; self.salary = salary
}
}
class Student:Person {
let id : Int
let rollNumber : Int
init(id:Int, rollNumber:Int) {
self.id = id; self.rollNumber = rollNumber
}
}
https://stackoverflow.com/questions/53799449
复制相似问题