diff --git a/Sources/Lookup/Lookup.swift b/Sources/Lookup/Lookup.swift index 4d65d71..f8f23b5 100644 --- a/Sources/Lookup/Lookup.swift +++ b/Sources/Lookup/Lookup.swift @@ -240,13 +240,34 @@ public struct Lookup: Swift.CustomStringConvertible, Swift.CustomDebugStringConv } } - private func castValueToString(value: Any) -> String { - if let data = try? JSONSerialization.data(withJSONObject: value, options: .prettyPrinted), + private func jsonToPrettyString(value: Any) -> String? { + if JSONSerialization.isValidJSONObject(value), + let data = try? JSONSerialization.data(withJSONObject: value, options: .prettyPrinted), let str = String(data: data, encoding: .utf8) { return str } - return "Can not cast value to string" + return nil + } + + private func castValueToString(value: Any) -> String { + if let str = jsonToPrettyString(value: value) { + return str + } + // map to string + switch value { + case let dict as Dictionary: + let strDict = Dictionary(uniqueKeysWithValues: dict.map { (key: String, value: Any) in + (key, "\(value)") + }) + return jsonToPrettyString(value: strDict) ?? "\(strDict)" + + case let arr as [Any]: + return jsonToPrettyString(value: arr) ?? "\(arr)" + + default: + return "\(value)" + } } public var description: String { diff --git a/Tests/LookupTests/LookupTests.swift b/Tests/LookupTests/LookupTests.swift index 42dae91..b7e3360 100644 --- a/Tests/LookupTests/LookupTests.swift +++ b/Tests/LookupTests/LookupTests.swift @@ -1,6 +1,9 @@ import XCTest @testable import Lookup import Foundation +#if os(iOS) +import UIKit +#endif enum AnimalType { case dog, cat @@ -244,7 +247,19 @@ final class LookupTests: XCTestCase { lookup["age"] = "8" XCTAssertEqual(lookup.age.int, 8) } - try codable() + + #if os(iOS) + func uiView() throws { + let view = UIView() + let lookup = Lookup(["view": view]) + XCTAssertEqual(lookup.description, """ +{ + "view" : "\(view)" +} +""") + } + try uiView() + #endif } }