Создать кодируемую структуру с универсальным типом - PullRequest
0 голосов
/ 04 июня 2018

Прежде всего, извините за неясное название вопроса

Я делаю кодируемую структуру, которая будет использоваться в качестве сообщения json.

enum MessageType: String, Codable{
    case content
    case request
    case response
}

struct Message: Codable{
    var type: MessageType
    var content: /* NEED HELP HERE */
}

struct Content: Codable {...}
struct Request: Codable {...}
struct Response: Codable {...}

При объявлении Message, еслиего type равен content, тип content должен быть Content.

let message = Message(
    type: .content,
    content: Content( ... )
}

Когда type равен request, тип content должен быть Request.

let message = Message(
    type: .request,
    content: Request( ... )
}

Тогда, как мне установить тип свойства content?

Я пытался сделать это как String следующим образом:

struct Message: Codable{
    var type: MessageType
    var content: String
}

struct Content: Codable{
    var jsonString: String{
        return String(data: try! JSONEncoder().encode(self), encoding: .utf8)
    }
}

let foo = Message(
    var type: .content,
    var content: Content ( ... ).jsonString
)

, и я мог бы использовать его, но я знаю об использовании его на разных платформах, таких как Android, поэтому яхочу получить более умный способ справиться с этим.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Попробуйте это в Сообщение Структура

var content: [String: Any]
0 голосов
/ 04 июня 2018

Используйте общий, как показано ниже:

struct Message<T:Codable>: Codable{
    var type: MessageType
    var content: T
}
...