swift - 如何限制泛型函数以防止使用数组和字典?
问题描述
有什么方法可以防止调用者通过约束或代码检查将数组或字典传递给这个函数?
internal class Decoder {
func decode<T: Decodable>(_ type: T.Type, from data: Data) throws -> T {
let decoder = try _Decoder(data: data)
return try T(from: decoder)
}
}
解决方案
您可以像这样进行约束T
:
func decode<T: Decodable>(_ type: T.Type,
from data: Data) throws -> T where T: AnyObject {
let decoder = try _Decoder(data: data)
return try T(from: decoder)
}
这样,Xcode 就不会让您将数组传递给该函数。但是您可能希望将自定义协议或类作为通用约束传递,因为AnyObject
您将无法传递结构。
我的建议是您创建(如果您还没有)自定义Decodable
协议并将其作为T
约束传递:
protocol ModelProtocol: Codable {}
class BaseModel: ModelProtocol {
}
struct Model: ModelProtocol {
}
func decode<T: ModelProtocol>(_ type: T.Type, from data: Data) throws {
let decoder = try _Decoder(data: data)
return try T(from: decoder)
}
这样你就会得到你需要的东西
let baz = try? decode(BaseModel.self, from: data)
let bar = try? decode(Model.self, from: data)
let foo = try? decode([Model].self, from: data)
//Instance method 'decode(_:from:)' requires that '[Model]' conform to 'ModelProtocol'
推荐阅读
- c++ - 在 C++ 中使用非常量引用作为 const
- php - 在 PHP curl 中访问 Bigcommerce 客户/current.jwt 时无效
- swift - 有没有办法在 Swift 中使用完整的 URL 请求从 iOS 应用程序内部打开 Safari 浏览器?
- kubernetes - 如何在负载均衡期间检查哪个 Kubernetes pod 正在响应?
- mysql - Node - 在内存之外存储数组的最快方法
- python - 如何使用关键字字典传递可选参数
- dashboard - 执行基于 maven 的端到端测试并在 Tekton Dashboard 中显示结果
- azure - Azure 数据工厂 - 如何防止恶意软件导入
- c++ - C ++ boost序列化多态性问题
- java - 如何在 Java 中将 XML 文件加载到数据库中?