映射/过滤数据流元素以转换其数据类型的正确语法是什么?

问题描述

场景:包含已从 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">

泛型不好玩吗?