函数是否可以根据输入的参数返回特定的数据类型?
这是我正在尝试做的一个例子:
我定义了不同的数据类型来保存来自 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
感谢您的帮助!
答案 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