尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Bow Optics入门:用Lens和Prism优雅操作不可变数据
Bow Optics入门用Lens和Prism优雅操作不可变数据【免费下载链接】bow Bow is a cross-platform library for Typed Functional Programming in Swift项目地址: https://gitcode.com/gh_mirrors/bow/bowBow是一个用于Swift的跨平台类型化函数式编程库它提供了强大的Optics组件帮助开发者以优雅的方式操作不可变数据。本文将带你快速掌握Lens和Prism这两种核心Optics工具让你轻松应对复杂数据结构的修改挑战。为什么需要Optics在函数式编程中不可变数据是核心原则之一。但当面对嵌套较深的数据结构时修改其中某个值就变得非常繁琐。例如要更新一个用户对象中地址的城市字段传统方式需要层层复制对象既不高效也不美观。Bow Optics提供了一种声明式的方式来访问和修改数据结构的特定部分就像为数据结构安装了光学镜片让你可以精准聚焦到需要操作的字段。Lens聚焦数据结构的特定字段Lens是一种能够聚焦到数据结构特定字段的Optics工具它本质上是一对函数get获取字段值和set设置字段值。通过Lens我们可以轻松访问和修改嵌套数据结构中的字段而无需手动复制整个对象。Lens的核心定义在Bow Optics中Lens的定义位于Sources/BowOptics/Lens.swiftpublic typealias LensS, A PLensS, S, A, A public class PLensS, T, A, B { private let getFunc: (S) - A private let setFunc: (S, B) - T public init(get: escaping (S) - A, set: escaping (S, B) - T) { self.getFunc get self.setFunc set } public func get(_ s: S) - A { ... } public func set(_ s: S, _ b: B) - T { ... } // 其他方法... }创建和使用Lens假设我们有以下数据结构struct User { let name: String let address: Address } struct Address { let street: String let city: String }我们可以创建一个Lens来聚焦到User的address字段let addressLens LensUser, Address( get: { $0.address }, set: { user, newAddress in User(name: user.name, address: newAddress) } )然后使用这个Lens来获取或修改用户的地址let user User(name: Alice, address: Address(street: Main St, city: New York)) let city addressLens.get(user).city // 获取城市 let updatedUser addressLens.set(user, Address(street: Oak Ave, city: Boston)) // 更新地址Lens的组合Lens最强大的特性之一是可组合性。我们可以将多个Lens组合起来创建一个能够聚焦到深层嵌套字段的Lenslet cityLens addressLens LensAddress, String( get: { $0.city }, set: { address, newCity in Address(street: address.street, city: newCity) } ) let updatedUser cityLens.set(user, Boston) // 直接更新城市Prism处理可选值和枚举类型Prism是另一种重要的Optics工具它适用于处理可选值和枚举类型。与Lens不同Prism处理的是可能不存在的值或只能在特定条件下访问的值。Prism的核心定义Prism的定义位于Sources/BowOptics/Prism.swiftpublic typealias PrismS, A PPrismS, S, A, A public class PPrismS, T, A, B { private let getOrModifyFunc: (S) - EitherT, A private let reverseGetFunc: (B) - T public init(getOrModify: escaping (S) - EitherT, A, reverseGet: escaping (B) - T) { self.getOrModifyFunc getOrModify self.reverseGetFunc reverseGet } public func getOrModify(_ s: S) - EitherT, A { ... } public func reverseGet(_ b: B) - T { ... } // 其他方法... }Prism有两个核心函数getOrModify尝试获取聚焦的值如果失败则返回原始值reverseGet从聚焦的值构建原始类型使用Prism处理可选值假设我们有一个可选类型的变量我们可以创建一个Prism来安全地访问它let optionalPrism PrismInt?, Int( getOrModify: { optional in optional.map(Either.right) ?? .left(nil) }, reverseGet: { $0 } ) let someValue: Int? 5 let noneValue: Int? nil optionalPrism.getOption(someValue) // Option.some(5) optionalPrism.getOption(noneValue) // Option.none() optionalPrism.reverseGet(10) // 10 as Int?使用Prism处理枚举类型Prism特别适合处理枚举类型。例如对于Result类型enum ResultSuccess, Failure: Error { case success(Success) case failure(Failure) } let successPrism PrismResultString, Error, String( getOrModify: { result in switch result { case .success(let value): return .right(value) case .failure(let error): return .left(.failure(error)) } }, reverseGet: { .success($0) } ) let successResult: ResultString, Error .success(Hello) let failureResult: ResultString, Error .failure(NSError(domain: com.example, code: 1)) successPrism.getOption(successResult) // Option.some(Hello) successPrism.getOption(failureResult) // Option.none() successPrism.reverseGet(World) // .success(World)何时使用Lens和PrismLens适用于访问和修改数据结构中必定存在的字段如结构体的属性。Prism适用于访问和修改可能不存在的值如可选类型、枚举的特定case。总结Bow Optics的Lens和Prism为Swift开发者提供了优雅处理不可变数据的强大工具。通过使用这些Optics你可以简化嵌套数据结构的访问和修改减少样板代码提高代码可读性编写更安全、更具表达力的函数式代码要开始使用Bow Optics只需将Bow库添加到你的项目中然后导入BowOptics模块即可。更多详细信息请参考官方文档和源代码。希望这篇文章能帮助你快速入门Bow Optics并在实际项目中应用这些强大的工具【免费下载链接】bow Bow is a cross-platform library for Typed Functional Programming in Swift项目地址: https://gitcode.com/gh_mirrors/bow/bow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

Win11Debloat:给Windows 11做一次彻底“卸重“,轻装出发的免费方案

Win11Debloat:给Windows 11做一次彻底“卸重“,轻装出发的免费方案

Win11Debloat:给Windows 11做一次彻底"卸重",轻装出发的免费方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various ot…

📅 2026/10/20 19:33:24
AI辅助《我的世界》皮肤制作:从创意到网易版上传全流程指南

AI辅助《我的世界》皮肤制作:从创意到网易版上传全流程指南

最近在《我的世界》社区里,一个现象越来越普遍:很多玩家已经不满足于使用现成的皮肤,而是希望拥有独一无二、能代表自己个性的专属形象。无论是想在服务器里脱颖而出,还是想为朋友制作一份特别的礼物,自定义皮肤都成了…

📅 2026/10/4 21:35:35
从源码到实践:手把手教你定制picasso2-okhttp3-downloader

从源码到实践:手把手教你定制picasso2-okhttp3-downloader

从源码到实践:手把手教你定制picasso2-okhttp3-downloader 【免费下载链接】picasso2-okhttp3-downloader A OkHttp 3 downloader implementation for Picasso 2. 项目地址: https://gitcode.com/gh_mirrors/pi/picasso2-okhttp3-downloader picasso2-okhttp…

📅 2026/10/10 10:28:27
MORE NEWS

更多资讯

📰

GitHub访问加速:Git仓库瘦身与依赖缓存实践

团队里但凡有一个人接手过"祖传大仓库",大概都经历过这种场面:git clone敲下去,进度条卡在Receiving objects: 43%,然后你去泡了杯茶、回了两条消息、顺手把桌面文件整理了一遍,回来发现它还在 47%。更别提 …

📰

Power Query动态路径:参数表与CELL函数解决路径写死问题

表格发给同事,对方双击打开、点了一下“全部刷新”,结果满屏红色报错——这个场景我遇到过不止一次。十有八九不是公式写错了,也不是数据源坏了,而是 Power Query 查询里那行写死的Folder.Files("D:\...")在别人的电脑上…

📰

机器视觉+检测+三维成像:MVDIT 2026会议投稿价值与技术要点解析

这些年我一直关注机器视觉、检测与三维成像方向,每次刷到圈里人转发的EI会议推荐都会多看一眼。前阵子被问到2026年可以冲哪个会,我直接把MVDIT 2026这个会议拎出来说了一遍——机器视觉、检测与三维成像技术国际学术会议,主题很对口&#xf…

📰

纯C跨平台硬件信息采集与设备指纹实现

简介:面向需要在 Linux 与 Windows 下完成硬件信息采集的 C/C 开发者与学习者,这份小型代码包聚焦 CPU 序列号、硬盘序列号、网卡名称、IP 地址、MAC 地址以及网线连接状态的获取,可服务于系统监控、设备识别、故障排查和课程实验等场景。压缩…

📰

全桥LLC谐振变换器PFM+PSM混合控制Simulink建模详解

全桥LLC谐振变换器,一听这名字就知道不是个善茬。我最早接触它是在一个某项目的输出样机上,纯PFM(变频控制)跑了半个多月,发现一个特别搞心态的现象:额定负载附近效率漂亮得很,波形也干净&#…

📰

量化策略源码骨架解析:从回测到实盘的完整链路

简介:这份量化策略源码资源面向具备一定Python与机器学习基础的量化研究者、金融数据爱好者及策略开发初学者,围绕个股日线数据的采集、预处理、建模、评估与仓位管理,提供一套可本地复现的完整流程,帮助读者理解从原始行情到组合…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬