macOS, iOS

[iOS] Codable URL이 "" 일 때 dataCorrupted 안나게 하기

SweetDev 2021. 4. 28. 11:04
import Cocoa

struct Company: Codable {
  let courseImages: [URL?]

  public init(from decoder: Decoder) throws {
    let values = try decoder.container(keyedBy: CodingKeys.self)

    let nullableEmployees = try values.decode([OptionalObject<URL>].self, forKey: .courseImages) // <1>
//    courseImages = nullableEmployees.compactMap { $0.value } // <2>
    courseImages = nullableEmployees.map { $0.value }
  }
}

public struct OptionalObject<Base: Decodable>: Decodable {
  public let value: Base?

  public init(from decoder: Decoder) throws {
    do {
      let container = try decoder.singleValueContainer()
      value = try container.decode(Base.self)
    } catch {
      value = nil
    }
  }
}

let json = """
{
  "courseImages":   ["https://naver.com", "https://naver.com", ""]
}
"""

do {
  let company = try JSONDecoder().decode(Company.self, from: json.data(using: .utf8)!)
  print(company)
} catch {
  print(error)
}