You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 5.10带异常抛出的UserDefaults下标编译错误求助

Swift 带异常抛出的下标实现问题排查与解决

Swift支持带异常抛出的下标,但你的写法不符合语法规范,导致了编译错误。

编译错误信息

Expected '->' for subscript element type
Expected type

错误代码

import Foundation

extension UserDefaults {
    private func setValue<E: Encodable>(_ object: E?, forKey key: String) throws {
        if object == nil {
            return removeObject(forKey: key)
        }
        
        let data = try JSONEncoder().encode(object)
        self.set(data, forKey: key)
    }

    private func object<D: Decodable>(forType type: D.Type, forKey key: String) throws -> D? {
        guard let data = self.data(forKey: key) else {return nil}
        return try JSONDecoder().decode(D.self, from: data)
    }
    
    public subscript<C: Codable>(key: String) (throws) -> C? {
        get {
            return try object(forType: C.self, forKey: key)
        } set {
            try setValue(newValue, forKey: key)
        }
    }
}

问题根源

抛出型下标的语法错误,正确的写法是将throws放在get/set关键字之后,而非用括号包裹在返回类型前。原代码中(throws)的写法不符合Swift语法规范。

修正后的代码

import Foundation

extension UserDefaults {
    private func setValue<E: Encodable>(_ object: E?, forKey key: String) throws {
        if object == nil {
            removeObject(forKey: key)
            return
        }
        
        let data = try JSONEncoder().encode(object)
        set(data, forKey: key)
    }

    private func object<D: Decodable>(forType type: D.Type, forKey key: String) throws -> D? {
        guard let data = data(forKey: key) else { return nil }
        return try JSONDecoder().decode(D.self, from: data)
    }
    
    // 修正抛出型下标的语法:将throws放在get/set关键字后
    public subscript<C: Codable>(key: String) -> C? {
        get throws {
            return try object(forType: C.self, forKey: key)
        }
        set throws {
            try setValue(newValue, forKey: key)
        }
    }
}

使用验证

你的预期使用代码可正常运行:

struct Person: Codable {
    var name: String
    var age: Int
}

// 存储Codable对象
let person = Person(name: "Alice", age: 30)
do {
    try UserDefaults.standard["person"] = person
} catch {
    print("Error storing person:", error)
}

// 读取Codable对象
do {
    if let storedPerson: Person = try UserDefaults.standard["person"] {
        print("Retrieved person:", storedPerson)
    } else {
        print("No person object found in UserDefaults")
    }
} catch {
    print("Error retrieving person:", error)
}

内容的提问来源于stack exchange,提问作者Manthan Gevariya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 23:22:07