当前位置: 首页 > news >正文

快速上手 iOS Protocol Buffer

快速上手 iOS Protocol Buffer | 来自缤纷多彩的灰

本文主要介绍在 iOS 开发中如何快速上手使用 Protobuf。更多关于 Protobuf 的介绍和相关的功能 api,读者可自行查阅官网。

Protocol Buffer(简称 Protobuf)是一种由Google开发的语言中立、平台无关的序列化数据结构的方法。它允许你定义结构化的数据,并提供一种高效且灵活的方式进行数据序列化和反序列化。

安装 Protobuf 工具

最简单的方式是直接通过 brew 进行安装:

brew install protobuf           // 支持生成.h和.m文件,和其他多种语言的文件
brew install swift-protobuf     // 支持生成.swift文件

检查是否安装成功:

protoc --version

protoc-gen-swift --version

创建 .proto 文件

// 使用V3语法

syntax = "proto3"

// OC语言可选,添加模型文件前缀

option objc_class_prefix = "MY"

// message代表一个模型

message Test {

    string title = 1;

    int32 tag = 2;

    Request request = 3;        // 自定义的 Request 类型

    repeated string values = 4; // 数组

}

message Request {

    string url = 1;

}

OC、Swift 代码生成

Protobuf 提供api用于根据.proto文件生成代码,需传入两个参数,生成结果与参数的传入顺序无关:

  1. .proto 文件的路径(下文中用 source_path 表示)
  2. 需要生成的目标语言(下文用 target_language 表示)以及文件的输出路径(下文用 target_path 表示)

protoc source_path/xxx.proto --target_language_out=target_path
 

protoc --objc_out=. xxx.proto      // 在当前文件夹根据xxx.proto生成.h和.m文件

protoc xxx.proto --swift_out=.     // 在当前文件夹根据xxx.proto生成.swift文件

在 iOS 工程中的使用

1.工程添加依赖

pod 'Protobuf'          // OC和其他多种语言的能力依赖

pod 'SwiftProtobuf'     // swift能力依赖

2.把转换后的代码文件加入到工程。

3.跟正常使用某个类的方法一样。

/*{"title": "test","tag": 1,"request": {"url": "www.fivehow.com"},"values": ["value1", "value2"]}*/let request = Request.with { $0.url = "www.whlcj.github.io" }
// ProtoBuf data
let test = Test.with {$0.title = "test"$0.tag = 1$0.request = request$0.values = ["value1", "value2"]
}
let binaryData = try? test.serializedData()
guard let binaryData = binaryData else { return }
_ = try? Test(serializedData: binaryData)
// Json Data
let jsonStr = "{\"title\":\"test\", \"tag\":1, \"request\":{\"url\":\"www.whlcj.github.io\"},\"values\":[\"value1\", \"value2\"]}"let jsonStrData = jsonStr.data(using: .utf8)// 对比 data length
print("binaryData: \(binaryData.count)")            // 43guard let jsonStrData = jsonStrData else { return }
print("jsonStrData: \(jsonStrData.count)")          // 92

protobuf 基础类型与Swift类型映射关系

Proto type

Swift Type

int32Int32
sint32Int32
sfixed32Int32
uint32UInt32
fixed32UInt32
int64Int64
sint64Int64
sfixed64Int64
uint64UInt64
fixed64UInt64
boolBool
floatFloat
doubleDouble
stringString
bytesData

相关文章:

快速上手 iOS Protocol Buffer

快速上手 iOS Protocol Buffer | 来自缤纷多彩的灰 本文主要介绍在 iOS 开发中如何快速上手使用 Protobuf。更多关于 Protobuf 的介绍和相关的功能 api,读者可自行查阅官网。 Protocol Buffer(简称 Protobuf)是一种由Google开发的语言中立、…...

每天一个数据分析题(四百八十)- 线性回归建模

关于线性回归建模,线性回归模型假设说法不正确的是? A. 因变量和自变量要有因果关系 B. 残差均值为0 C. 残差服从正态分布 D. 自变量不存在共线性 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专…...

电动汽车和混动汽车DC-DC转换器的创新设计与测试方法

汽车 DC-DC 转换器市场规模将达到187亿美元,年复合增长率为10%。 DC-DC 转换器是汽车的重要组成部分,它可以通过电压转换为各种车载系统供电,例如日益复杂的车载信息娱乐系统、使用驾驶辅助系统(ADAS)实现的增强安全功…...

OriginPro快速上手指南:数据可视化与分析的利器

目录 OriginLab - Origin and OriginPro - Data Analysis and Graphing Softwarehttps://www.originlab.com/​编辑 一、安装与界面概览 安装 界面概览 二、基础操作 数据输入 创建图表 三、高级功能 数据分析 自动化与脚本 Origin 提供了几个小工具 四、技巧与提示…...

缓存学习

缓存基本概念 概念 对于缓存,最普遍的理解是能让打开某些页面速度更快的工具。从技术角度来看,其本质上是因为缓存是基于内存建立的,而内存的读写速度相比之于硬盘快了xx倍,因此用内存来代替硬盘作为读写的介质当然能大大提高访…...

亚世光电:消费电子年度表演

机圈风云再起,消费电子乘风而起? 今天我们来聊——亚世光电 最近,华为mate60突然降价,被大家怀疑是为新品上市做准备,算算时间,下半年的消费电子大战也即将拉开帷幕,而亚世光电所在的光电显示领…...

AI 工程应用 建筑表面检测及修复

文章目录 1 项目概述(必写):2 技术方案与实施步骤2.1 模型选择(必写):2.2 数据的构建:2.3 功能整合(进阶): 3 实施步骤:3.1 环境搭建(…...

Qt-Qt中的小事项(7)

目录 命名风格 快捷键 查询文档 坐标系 代码理解 move 命名风格 这个也是老生常谈的问题了,入乡随俗就好啦 快捷键 这里是一些常用的快捷键,用多了自然就熟悉了 • 注释:ctrl/ • 运行:ctrlR • 编译:ctrlB …...

Android MediaRecorder 视频录制及报错解决

目录 一、start failed: -19 二、使用MediaRecorder录制视频 2.1 申请权限 2.2 布局文件 2.3 MediaRecordActivity 2.4 运行结果 三、拓展 3.1 录制视频模糊(解决) 3.2 阿里云OSS上传文件 3.2.1 权限(刚需) 3.2.2 安装SDK 3.2.3 使用 相关链接 一、start failed…...

HarmonyOS应用程序访问控制探究

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 一、引言 随着信息技术的飞速发展,移动应用程序已经成为…...

董卫民赴考拉悠然等企业调研,强调加快发展人工智能产业

8月14日,按照省政府重点产业链协同推进机制有关工作安排,省委常委、常务副省长董卫民在成都市调研人工智能产业发展情况,并召开座谈会。他强调,要坚决落实党的二十届三中全会精神和省委省政府决策部署,充分把握人工智能…...

MFC将类A中的事件在类B中处理采用回调函数实现

需求: 在类A的界面上有一个tab控件。tab控件上面有那个页面。在MFC编程中一个tab的一个页面就应该是一个新的类。在tab的一个页面上有一个list控件。现在需要将list控件的点击事件,双击事件等在类A里面处理。 解决: 在类B里面给控件list添加…...

公众号 微信登录

export function getWxCode(that, localhostUrl) { // localhostUrl 当前页面的路径 传这个也可以this.$route.fullPath// console.log(that.$store.state.wxSessionData)// console.log(that.$store.state.wxSessionData.openId)//openId为undefine执行获取openid判断是否没有…...

sanic + webSocket:股票实时行情推送服务实现

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…...

Unity动态给按钮各个状态下的图片赋值

Unity动态给按钮各个状态下的图片赋值 using UnityEngine; using UnityEngine.UI; public class ButtonOnClickTest : MonoBehaviour {public Button btn;public Sprite _highlighterSprite;public Sprite _pressedSprite;public Sprite _selectesdSprite;public Sprite _disa…...

xiaomi pad 6PRO 小米平板6 pro hyperOS降级 澎湃os 降级MIUI 14 教程 免解锁BL 降级,168小时解锁绑定

小米平板 6 Pro 机型代号 :liuqin 降级MIUI 14 小米澎湃 OS 正式版 澎湃OS安卓发布日期卡刷包线刷包OS1.0.7.0.UMYCNXM14.02024-07-13miui_LIUQIN_OS1.0.7.0.UMYCNXM_d618a5c980_14.0.zipliuqin_images_OS1.0.7.0.UMYCNXM_20240705.0000.00_14.0_cn_8cbf5920be.…...

MySQL 备份一个表

语法(创建一个与table1结构相同的新表table2,并且将table1的数据复制到table2): create table table2 as select * from table1 举例(备份tb_log表到tb_log_20240815中去): create table tb_log_20240815 as select * from tb_log...

鸿蒙开发入门day10-组件导航

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,还请三连支持一波哇ヾ(@^∇^@)ノ) 目录 组件导航 (Navigation) 设置页面显示模式 设置标题栏模式 设置菜…...

虚拟机Linux的坑 | VMware无法从主机向虚拟机 跨系统复制粘贴拖动 文件/文本

这个情况下,还是没办法跨系统拖拽文件 解决办法: 在终端中输入命令 sudo apt-get autoremove open-vm-tools sudo apt-get install open-vm-tools sudo apt-get install open-vm-tools-desktop过程中只要需要选择是否覆盖的地方,都输入&…...

Chat App 项目之解析(二)

Chat App 项目介绍与解析(一)-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序,旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录,还提供了管理员登录功能,以便管理员可以…...

质子CT技术:原理、系统设计与临床应用

1. 质子CT技术概述:从原理到临床需求在放射治疗领域,质子治疗因其独特的布拉格峰(Bragg Peak)特性而备受关注。与传统X射线治疗相比,质子束在组织中沉积的能量分布具有明显的物理优势——在射程末端释放最大剂量后迅速衰减。这一特性使得肿瘤…...

从八皇后到N皇后:深度优先搜索(DFS)的经典实战与优化技巧

从八皇后到N皇后:深度优先搜索(DFS)的经典实战与优化技巧 在国际象棋的64格棋盘上放置8个互不攻击的皇后,这个看似简单的谜题背后隐藏着组合数学的深邃奥秘。当我们将问题扩展到NN棋盘上的N皇后问题时,它便成为了检验算法效率的绝佳试金石。本…...

Analog Discovery 2:口袋实验室如何用FPGA重塑硬件调试体验

1. 口袋里的实验室:为什么我们需要Analog Discovery 2?作为一名在硬件开发一线摸爬滚打了十多年的工程师,我太熟悉那种面对复杂项目时,被实验室设备“卡脖子”的窘迫感了。你想验证一个想法,或者排查一个棘手的信号问题…...

STR912评估板UART0通信故障排查与解决方案

1. MCBSTR9评估板UART0通信故障排查指南最近在调试STR912芯片的串口通信时,发现一个硬件设计上的"坑"值得分享。使用Keil MCBSTR9评估板V2版本时,UART0(COM1)接口竟然无法正常工作!经过一番排查,…...

本地部署 SQLite 数据库管理工具 SQLite Web 并实现外部访问( Linux 版本)

SQLite Web 是一款轻量级的、基于 Web 的图形化界面工具,用于浏览和管理 SQLite 数据库文件,它通常以一个独立的可执行文件或 Python 包的形式存在,让用户可以通过浏览器方便地查看、查询、编辑和管理 .db 或 .sqlite 等 SQLite 数据库。本文…...

2025届毕业生推荐的AI辅助论文网站解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下,学术研究越发受到人们的重视,在此种背景状况之下,论…...

双足机器人步态规划算法与动平衡控制【附仿真】

✨ 长期致力于双足机器人、步态规划、动平衡控制、运动发散分量、模型预测控制、二次优化、可视化仿真研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1&#xff09…...

车载以太网之要火系列 - 第49篇郭大侠学SOME/IP:人说SOME/IP虽好,对手已在路上跑

写在开篇蓉儿又挖坑上回说到,郭靖学完了SOME/IP的十八般武艺——报文头、Service ID、Instance ID、Method、Event、Field、SD的Offer/Find/Subscribe三驾马车。郭靖合上笔记本,信心满满:“蓉儿,SOME/IP我算是学透了!服…...

基于HPM5E00与LAN9252的EtherCAT从站开发板全流程实战

1. 项目概述:从零到一,打造专属的 EtherCAT 从站开发板 最近在工业自动化圈子里,EtherCAT 的热度一直居高不下。它那近乎实时的通讯性能、灵活的拓扑结构,让它在运动控制、机器人、高端数控机床等领域成了“香饽饽”。但很多开发者…...

为ClaudeCode配置Taotoken作为稳定可靠的API供应商

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为ClaudeCode配置Taotoken作为稳定可靠的API供应商 Claude Code 是一款广受开发者欢迎的编程助手工具,它依赖于后端的大…...