可以返回各种类型的 Swift 函数

时间:2021-03-06 16:59:38

标签: swift

函数是否可以根据输入的参数返回特定的数据类型?

这是我正在尝试做的一个例子:

我定义了不同的数据类型来保存来自 API 调用的数据

struct DataType1: Codable {
    var id: Int
    var name: String
}

struct DataType2: Codable {
    var id: Int
    var name: String
}

struct DataType3: Codable {
    var id: Int
    var name: String
}

let type1 = [DataType1(id: 0, name: "Kirk"),
             DataType1(id: 1, name: "Spock"),
             DataType1(id: 2, name: "McKoy"),
             DataType1(id: 3, name: "Sulu"),
             DataType1(id: 4, name: "Chekov"),
             DataType1(id: 5, name: "Uhura"),
             DataType1(id: 6, name: "Scott")]

let type2 = [DataType2(id: 0, name: "Picard"),
             DataType2(id: 1, name: "Riker"),
             DataType2(id: 2, name: "Data"),
             DataType2(id: 3, name: "Worf"),
             DataType2(id: 4, name: "La Forge"),
             DataType2(id: 5, name: "Crusher"),
             DataType2(id: 6, name: "Troi")]

let type3 = [DataType3(id: 0, name: "Sisko"),
             DataType3(id: 1, name: "Nerys"),
             DataType3(id: 2, name: "Dax"),
             DataType3(id: 3, name: "Odo"),
             DataType3(id: 4, name: "Bashir"),
             DataType3(id: 5, name: "O'Brien"),
             DataType3(id: 6, name: "Quark")]

我有一个列表视图,它将根据条件显示数据。我研究了泛型和枚举等不同的解决方案,但找不到任何解决我的具体问题的方法。

我正在尝试编写一个函数,例如:

func getCrew(show: String) {
    switch show {
    case "Star Trek: TOS":
        return type1
    case "Star Trek: The Next Generation":
        return type2
    case "Star Trek: Deep Space Nine":
        return type3
    default:
        return nil
    }
}

for type in getCrew(show: "Star Trek: TOS") {
    print(type.name)
}

也得到如下输出:

// Kirk
// Spock
// McKoy
// Sulu
// Chekov
// Uhura
// Scott

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您可以使用协议:

使用给定的字段创建协议,并使所有 DataType1,2 等类都符合它:

protocol DataType {
    var id: Int {get set}
    var name: String {get set}
}

struct DataType1: DataType, Codable {
    var id: Int
    var name: String
}

struct DataType2: DataType, Codable {
    var id: Int
    var name: String
}

struct DataType3: DataType, Codable {
    var id: Int
    var name: String
}

将 DataType 协议作为返回类型添加到您的函数“getCrew”:

func getCrew(show: String) -> [DataType]? {
    switch show {
    case "Star Trek: TOS":
        return type1
    case "Star Trek: The Next Generation":
        return type2
    case "Star Trek: Deep Space Nine":
        return type3
    default:
        return nil
    }
}

对结果使用迭代:

for type in getCrew(show: "Star Trek: TOS") ?? [] {
    print(type.name)
}

PS 使用三个具有相同字段和逻辑的不同类似乎是错误的。为什么不为所有数据使用一个 DataType 类?

答案 1 :(得分:0)

首先,您的所有数据类型都是相同的。您可以将相同的数据与额外的一个属性一起使用,如下所示

struct DataType3: Codable {
    var id: Int
    var name: String
    var dataType: Int//1,2,3
} 

顺便说一句,您可以使用泛型来允许具有相同功能的不同类型。 Generics in Swift

相关问题