Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
937 views
in Technique[技术] by (71.8m points)

swift - Create codable struct with generic type

First of all, Sorry for unclear title of question

I'm making a codable struct which will be used as json message.

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 {...}

When declaring Message, if its type is content, its content's type should be Content.

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

When type is request, its content's type should be Request.

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

Then, How should I set content property's type?

I tried to make it as String like this way :

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
)

and I could use it, But I'm aware of using it in different platforms like Android, So I want to get more smart way to deal with this.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Use generic like below:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...