ios - 编码通用 String 对象给出 nil Swift

标签 ios swift generics codable

我有一个 UserDefaults 类,用于处理存储、删除和获取存储对象的默认值。我相信这是完整的类(class),简洁明了:

现在问题出在存储函数上。我似乎无法对 Encodable String 对象进行编码。我知道我可以将该对象存储为默认值,但这会破坏此处理通用对象的 MVDefaults 的目的。

我在这里遗漏了什么吗?

import Foundation

enum MVDefaultsKey: String {
    case requestToken = "defaultsRequestToken"
}

/// The class that has multiple class functions for handling defaults.
/// Also has the helper class functions for handling auth tokens.
class MVDefaults {

    // MARK: - Functions

    /// Stores token.
    class func store<T: Encodable>(_ object: T, key: MVDefaultsKey) {
        let encoder = JSONEncoder()
        let encoded = try? encoder.encode(object)
        UserDefaults.standard.set(encoded, forKey: key.rawValue)
    }

    /// Removes the stored token
    class func removeDefaultsWithKey(_ key: MVDefaultsKey) {
        UserDefaults.standard.removeObject(forKey: key.rawValue)
    }

    /// Returns stored token (optional) if any.
    class func getObjectWithKey<T: Decodable>(_ key: MVDefaultsKey, type: T.Type) -> T? {
        guard let savedData = UserDefaults.standard.data(forKey: key.rawValue) else {
            return nil
        }

        let object = try? JSONDecoder().decode(type, from: savedData)

        return object
    }
}

最佳答案

想想字符串 "hello" 编码成 JSON 会是什么样子。它看起来像:

"hello"

不是吗?

这不是有效的 JSON(根据 here )!您不能将字符串直接编码为 JSON,也不能直接将字符串解码。

比如这段代码

let string = try! JSONDecoder().decode(String.self, from: "\"hello\"".data(using: .utf8)!)

会产生错误

JSON text did not start with array or object and option to allow fragments not set.

let data = try! JSONEncoder().encode("Hello")

会产生错误:

Top-level String encoded as string JSON fragment.

此处的工作只是使用 UserDefaults 提供的专用 set 方法来存储您的字符串。你仍然可以使用你的泛型方法,不过,你只需要检查类型和转换:

if let str = object as? String {
    UserDefaults.standard.set(str, forKey: key)
} else if let int = object as? Int {
    ...

关于ios - 编码通用 String 对象给出 nil Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56413255/

相关文章:

C# - 具有 new() 约束的泛型如何生成机器码?

ios - 重用系统和以编程方式设计的 TableView 问题

Swift:避免命令式 For 循环

细胞中的 swift GestureRecognizer

ios - 无法在ios模拟器中调试

Java - 在具有 Class<? 的泛型类上使用 newInstance()扩展我的类> : InstantiationException

java - 如何获取泛型函数体内的实际类型?

ios - ios的可扩展单元格表格 View 最佳实践

ios - 点击手势识别器会干扰 UITextView 中的 URL 点击

ios - Documents 文件夹路径中的十六进制部分是什么?