Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使结构符合swift 4中具有符合另一协议的属性的协议?_Swift_Protocols_Decodable - Fatal编程技术网

如何使结构符合swift 4中具有符合另一协议的属性的协议?

如何使结构符合swift 4中具有符合另一协议的属性的协议?,swift,protocols,decodable,Swift,Protocols,Decodable,我打算将web服务中的一些JSON数据反映到swift结构中。所以我创建了一个符合可解码协议的协议,并计划创建一些结构来符合它。这是我创建的协议: protocol XFNovelApiResponse: Decodable { var data: Decodable {get} var error: NovelApiError {get} } struct NovelApiError: Decodable { let msg: String let errorCo

我打算将web服务中的一些JSON数据反映到swift结构中。所以我创建了一个符合可解码协议的协议,并计划创建一些结构来符合它。这是我创建的协议:

protocol XFNovelApiResponse: Decodable {

   var data: Decodable {get}
   var error: NovelApiError {get}
}

struct NovelApiError: Decodable {

   let msg: String
   let errorCode: String
}
它是汇编的。但是当我开始写我的结构时,我犯了一个错误。结构的代码如下所示:

struct XFNovelGetNovelsApiResponse: XFNovelApiResponse {

    let data: NovelsData

    let error: NovelApiError

    struct NovelsData: Decodable {

    }
}

错误显示类型“XFNovelGetNovelsApiResponse”不符合协议“xfNovelAppResponse”。我知道“数据”属性应该以错误的方式实现。我怎样才能修好它?谢谢。

您要求描述的是
数据可以保存的类型,而不是实际类型。这意味着它需要是一个
关联类型

protocol XFNovelApiResponse: Decodable {
    associatedtype DataType: Decodable
    var data: DataType {get}
    var error: NovelApiError {get}
}

注意,关联类型的协议会产生很多复杂性,因此您应该仔细考虑该协议是否真的必要,或者如果<代码> XFNovelApiResponse <代码>可以是通用的。这取决于实现此协议的其他类型

例如,没有协议的一组类似数据结构的另一个实现是:

struct XFNovelApiResponse<DataType: Decodable>: Decodable {
    var data: DataType
    var error: NovelApiError
}

struct NovelsData: Decodable {
}

struct NovelApiError: Decodable {

    let msg: String
    let errorCode: String
}

let novels = XFNovelApiResponse(data: NovelsData(),
                                error: NovelApiError(msg: "", errorCode: ""))
struct xfNovelapirResponse:可解码{
变量数据:数据类型
变量错误:NovelApiError
}
结构NovelsData:可解码{
}
结构Novelapier错误:可解码{
让msg:String
让错误代码:String
}
让小说=xFnovelapirResponse(数据:NovelsData(),
错误:NovelApiError(消息:“”,错误代码:“”)
或者,您可以使用允许继承的类和子类来实现这一点。结构不是从协议继承的,它们符合协议。如果你真的是指继承,那么类是正确的工具。(但我认为泛型是更好的解决方案。)