Swift 扩展 - 必须在非专用泛型类型上声明约束扩展 'Array'
Swift extension - Constrained extension must be declared on the unspecialized generic type 'Array'
我有一个 API returns 一个 JSON 对象数组。我已将结构设置如下:
typealias MyModels = [MyModel]
struct MyModel: Codable {
let field1: String
let field2: String
let mySubModel: SubModel?
enum CodingKeys: String, CodingKey {
case field1 = "Field1"
case field2 = "Field2"
case mySubModel = "MySubModel"
}
}
struct SubModel: Codable {
let subModelField1: String
let subModelField2: String
enum CodingKeys: String, CodingKey {
case subModelField1 = "SubModelField1"
case subModelField2 = "SubModelField2"
}
}
我想要做的是添加这个扩展,提供路径变量(NetworkModel 协议为 API 操作提供了一些基本功能):
extension MyModels: NetworkModel {
static var path = "the/endpoint/path"
}
我在其他 model/struct class 中没有任何问题,当基数是一个对象或 json 键时,我以这种方式设置。但是,由于这个不同并且只是一个数组,所以当我将该扩展名放入 class:
时出现此错误
Constrained extension must be declared on the unspecialized generic type 'Array' with constraints specified by a 'where' clause
我已经进行了一些挖掘并尝试了一些关于扩展名的 where 子句的事情,但我对它想要什么感到有点困惑。我敢肯定这很简单,但是对此有什么想法吗?如果我需要用上面的类型别名以不同的方式处理它,我可以接受。提前致谢!
我假设你的意思是
extension MyModels: NetworkModel {
有错误?您似乎错过了一个 s
。
错误基本上是告诉你这样做:
extension Array : NetworkModel where Element == MyModel {
static var path = "the/endpoint/path"
}
您不能简单地扩展 [MyModel]
。
虽然 Sweeper 根据最初的问题适当地回答了问题,但我想提供一种替代方法,即使可能稍微复杂一些。这可以通过覆盖事物的可解码方面并手动将模型放入列表中来实现:
struct MyModels: Codable {
var modelList: [MyModel] = []
public init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
let metaType = (Account.self as Decodable.Type)
while !container.isAtEnd {
let subdecoder = try container.superDecoder()
if let model = try metaType.init(from: subdecoder) as? MyModel {
modelList.append(model)
}
}
}
}
struct MyModel: Codable {
let subModelField1: String
let subModelField2: String
enum CodingKeys: String, CodingKey {
case subModelField1 = "SubModelField1"
case subModelField2 = "SubModelField2"
}
}
extension MyModels: NetworkModel {
static var path = "the/endpoint/path"
}
我有一个 API returns 一个 JSON 对象数组。我已将结构设置如下:
typealias MyModels = [MyModel]
struct MyModel: Codable {
let field1: String
let field2: String
let mySubModel: SubModel?
enum CodingKeys: String, CodingKey {
case field1 = "Field1"
case field2 = "Field2"
case mySubModel = "MySubModel"
}
}
struct SubModel: Codable {
let subModelField1: String
let subModelField2: String
enum CodingKeys: String, CodingKey {
case subModelField1 = "SubModelField1"
case subModelField2 = "SubModelField2"
}
}
我想要做的是添加这个扩展,提供路径变量(NetworkModel 协议为 API 操作提供了一些基本功能):
extension MyModels: NetworkModel {
static var path = "the/endpoint/path"
}
我在其他 model/struct class 中没有任何问题,当基数是一个对象或 json 键时,我以这种方式设置。但是,由于这个不同并且只是一个数组,所以当我将该扩展名放入 class:
时出现此错误Constrained extension must be declared on the unspecialized generic type 'Array' with constraints specified by a 'where' clause
我已经进行了一些挖掘并尝试了一些关于扩展名的 where 子句的事情,但我对它想要什么感到有点困惑。我敢肯定这很简单,但是对此有什么想法吗?如果我需要用上面的类型别名以不同的方式处理它,我可以接受。提前致谢!
我假设你的意思是
extension MyModels: NetworkModel {
有错误?您似乎错过了一个 s
。
错误基本上是告诉你这样做:
extension Array : NetworkModel where Element == MyModel {
static var path = "the/endpoint/path"
}
您不能简单地扩展 [MyModel]
。
虽然 Sweeper 根据最初的问题适当地回答了问题,但我想提供一种替代方法,即使可能稍微复杂一些。这可以通过覆盖事物的可解码方面并手动将模型放入列表中来实现:
struct MyModels: Codable {
var modelList: [MyModel] = []
public init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
let metaType = (Account.self as Decodable.Type)
while !container.isAtEnd {
let subdecoder = try container.superDecoder()
if let model = try metaType.init(from: subdecoder) as? MyModel {
modelList.append(model)
}
}
}
}
struct MyModel: Codable {
let subModelField1: String
let subModelField2: String
enum CodingKeys: String, CodingKey {
case subModelField1 = "SubModelField1"
case subModelField2 = "SubModelField2"
}
}
extension MyModels: NetworkModel {
static var path = "the/endpoint/path"
}