问题描述
场景:包含已从 Int
类型更改为 String
类型的项目的数据流导致 JSON 解析器崩溃。
结果:订阅者“接收器”崩溃,数据类型与通过 JSON 解析器的原始接收类型不匹配。
目标:将 Int
值转换为 String
以获得成功解析的一致流。
这是导致崩溃的数据流片段:
...
{
"city": "אלון שבות","sickCount": 124,"actualSick": 15,"verifiedLast7Days": " 11-14 ","testLast7Days": 699,"patientDiffPopulationForTenThousands": 47
},{
"city": "סייד (שבט)","sickCount": " קטן מ-15 ","actualSick": " קטן מ-15 ","verifiedLast7Days": " 0 ","testLast7Days": 17,"patientDiffPopulationForTenThousands": 4
},...
这是通过控制台的错误:
CodingKeys(stringValue: "sickCount",intValue: nil)],debugDescription: "预期解码 Int 但找到了一个字符串/数据。",underlyingError: nil))
代码如下:
func getData() {
let str = "https://disease.sh/v3/covid-19/gov/Israel"
let url = URL(string: str)!
let remoteDataPublisher = URLSession.shared.dataTaskPublisher(for: url)
.map(\.data)
.receive(on: dispatchQueue.main)
.decode(type: IsraelDataElement.self,decoder: JSONDecoder())
remoteDataPublisher
.erasetoAnyPublisher()
.sink(receiveCompletion: { completion in
switch completion {
case .finished:
print("{IsraelModel} Publisher Finished")
case let .failure(anError):
Swift.print("\nIsrael - Received error: #function",anError)
}
},receiveValue: { someData in
self.add_UUID(origData: someData)
print(someData)
}).store(in: &cancellables)
}
解决方法
Swift 是强类型的,所以它不会为你强制类型。如果您真的希望类型是异构的,那么习惯上您应该使用枚举来表示这个东西是 Int 或 String。这是您实际上可以往返数据并保留类型的唯一方法。例如:
.username {
border-radius: 0%;
}
.username :focus{
border-radius: 30%;
}
如果这只是您的后端开发人员粗心大意的情况,那么您可以自己转换类型,您可以通用地这样做,这样您就可以轻松地解决应用程序中任何地方的数据问题:
<input class="username" type="text" placeholder="Username or Email">
泛型不好玩吗?