Как мне создать функцию, которая принимает любой тип и выводит его строковую версию JSON? - PullRequest
1 голос
/ 09 июля 2020

Меня немного сбивает с толку использование следующего кода снова и снова, чтобы преобразовать мои данные в JSON, и я надеялся, что есть собственная многоразовая функция для достижения того же самого, когда я могу передать что угодно, она проверит, если это Encodable и либо выводит nil, либо String:

let encoder = JSONEncoder()
let formatter = DateFormatter()
formatter.dateStyle = .medium
encoder.dateEncodingStrategy = .formatted(formatter)
            
guard let jsonDateData = try? encoder.encode(dateOfApproval) else {return}
guard let myDateString = String(data: jsonDateData, encoding: .utf8) else {return}

Суть проблемы, похоже, заключается в том, что я не могу проверить, является ли отправляемый объект Any как Encodable, оставляя меня проверять укажите тип c (как показано ниже):

func shapeData(dataToShape: Any)-> String? {
    let encoder = JSONEncoder()
    let formatter = DateFormatter()
    formatter.dateStyle = .medium
    encoder.dateEncodingStrategy = .formatted(formatter)
    
    if let hi = dataToShape as? String { // I'd prfer to be able to check if it's encodable here instead of a specific type
        guard let jsonDateData = try? encoder.encode(hi) else {return nil}
        guard let myDateString = String(data: jsonDateData, encoding: .utf8) else {return nil}
        return myDateString
    } else {
        return nil
    }
}

Я пробовал if dataToShape is Encodable, но это тоже не сработало.

1 Ответ

1 голос
/ 09 июля 2020

Вы можете сделать вашу функцию generi c. Таким образом, ваш параметр dataToShape будет иметь некоторый общий тип c, который вы можете ограничить до Encodable:

func shapeData<T>(dataToShape: T) -> String? where T: Encodable {
    let encoder = JSONEncoder()
    let formatter = DateFormatter()
    formatter.dateStyle = .medium
    encoder.dateEncodingStrategy = .formatted(formatter)
    
    guard let jsonDateData = try? encoder.encode(dataToShape) else {return nil}
    guard let myDateString = String(data: jsonDateData, encoding: .utf8) else {return nil}
    return myDateString
}
...