Swift通用类型

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (84)

我是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)
    }
}

下面是viewcontroller我订阅提供商

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”可以定义他期望从“成功”块中得到的结果类型?

提问于
用户回答回答于

使用关联值作为.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
    }
}

扫码关注云+社区

领取腾讯云代金券