swift中自定义的结构体怎么转成data

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift中自定义的结构体怎么转成data相关的知识,希望对你有一定的参考价值。

举例说明:
1. 定义结构体
struct BLEVolumeCMD
var cmd: UInt8 = 0xA0 // 指令头
var volume1: UInt8 = 0 // 4个音量
var volume2: UInt8 = 0
var volume3: UInt8 = 0
var volume4: UInt8 = 0
var reserved: UInt8 = 0xff // 保留字节

2.实例化结构体

var cmd: BLEVolumeCMD = BLEVolumeCMD()
这里还可以给,cmd 的成员变量赋值,比如:

cmd.volume1 = 0x11
cmd.volume2 = 0x22
cmd.volume3 = 0x33
cmd.volume4 = 0x44
3. 最后转为Data:

let data: Data = Data.init(bytes: &cmd, count: MemoryLayout<BLEVolumeCMD>.size)
参考技术A Swift是一款易学易用的编程语言,而且它还是第一套具有与脚本语言同样的表现力和趣味性的系统编程语言。Swift的设计以安全为出发点,以避免各种常见的编程错误类别。

Swift中自定义对象和自定义对象数组的通用属性[重复]

【中文标题】Swift中自定义对象和自定义对象数组的通用属性[重复]【英文标题】:Generic property for Custom Object and Array of Custom Object in Swift [duplicate] 【发布时间】:2020-07-15 16:44:17 【问题描述】:

我从 API 收到两种不同格式的响应

1.作为对象的数据


   code: 0,
   message: “string”,
   data : 
       …
   

2.作为对象数组的数据


   code: 0,
   message: “string”,
   data : [
       … 
   , 
   
       …
   ]

我目前正在使用两种模型来获取解析后的 JSON,并且运行良好。

public class BaseModel : Decodable 
    var code:Int?
    var message:String?


public class DataObject<T> : BaseModel 
    var data : T?
 

public class DataArray<T> : BaseModel 
    var data : [T] = []

有没有办法让一个通用属性可以保存一个自定义对象或一组自定义对象?

更新根据建议,我已要求 API 团队更新响应。

【问题讨论】:

您可以使用带有属性关联值的枚举。但是,为什么不总是将属性建模为一个数组(如果不是数组,则为一个项目) 有时返回单个对象和有时返回数组的 API 似乎是糟糕的 API 设计。它应该总是返回相同的东西。如果只有一个对象,它应该返回一个包含一个对象的数组。如果可能,我建议您尝试进行更改。 相关:***.com/questions/58513344/… 【参考方案1】:

您可以在 Codable 模型中实现 init(from:) 并使用自定义解析来实现此功能。

public class BaseModel: Decodable 
    var code: Int
    var message:String
    var data: [DataObject]
    
    enum CodingKeys: String, CodingKey 
        case code, message, data
    
    
    required public init(from decoder: Decoder) throws 
        let container = try decoder.container(keyedBy: CodingKeys.self)
        code = try container.decode(Int.self, forKey: .code)
        message = try container.decode(String.self, forKey: .message)
        if let dataValue = try? container.decode(DataObject.self, forKey: .data) 
            data = [dataValue]
         else 
            data = try container.decode([DataObject].self, forKey: .data)
        
    


public class DataObject: Decodable 
    ....

【讨论】:

以上是关于swift中自定义的结构体怎么转成data的主要内容,如果未能解决你的问题,请参考以下文章

5.4 Go语言中自定义类型与结构体(Struct)

5.4 Go语言中自定义类型与结构体(Struct)

Swift Struct 结构体

matlab 怎么将374个结构体数据保存在一个数组中?用哪个函数

Swift 的 结构体

Swift 结构体与类