Swift 社区中一个有用的提案

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

在 Swift 官方 GitHub 上,有很多人为 Swift 贡献代码,但是在贡献代码之前,往往需要先写一个提案,提案通过之后才会进入开发流程,这也是我平时上网经常逛的一个地方,能看到大家对 Swift 的进化提出的各种提案。

前段时间,我在浏览 Swift 社区时,发现了一个非常有趣的提案:SE-0404 嵌套协议1。这个提案旨在增加 Swift 语言对嵌套协议的支持,为 Swift 开发者提供更多的灵活性和表达力。截止这篇博客发出,这个提案已经通过审核并跟随 Xcode 15.3、Swift 5.10 中发布了。

提案概览

在当前的 Swift 版本中,协议不能被定义在另一个协议、结构体、或类内部。这个限制意味着开发者不能在一个封闭的作用域内定义协议,导致了一些设计模式的实现变得复杂。SE-0404 提案建议移除这一限制,允许协议被定义在其他类型内部,包括其他协议、结构体、类等。

动机

这个提案的主要动机是为了增加 Swift 语言的灵活性和表达能力。通过允许嵌套协议的定义,开发者可以创建更加封装和模块化的代码。这在实现特定的设计模式时尤其有用,比如在代理模式或装饰器模式中定义一个内部协议,这样可以更清晰地表达这些模式的意图和结构。

此外,嵌套协议还可以用于限定命名空间,避免全局命名空间的污染,同时也使得协议的组织和管理变得更加容易。

示例

让我们看一个简单的例子来理解这个提案如何在实践中使用。假设我们正在实现一个网络请求库,我们可能想要在这个库内部定义一些相关的协议:

swift 复制代码
class NetworkManager {

    protocol Delegate {
        func didReceiveData(_ data: Data)
        func didFailWithError(_ error: Error)
    }
    
    var delegate: Delegate?

    // NetworkManager 的其他实现
}

在当前的 Swift 版本中,这样的代码是不合法的,因为协议 Delegate 被定义在类 NetworkManager 内部。

再举个系统例子,最常用的组件之一 UITableView,它的代理协议叫 UITableViewDelegate 和 UITableViewDataSource,如果将这两个协议嵌套在 UITableView 中,既能表达清楚用意,又能保证命名空间的污染:

swift 复制代码
class UITableView {

    protocol Delegate {
    }
    
    protocol DataSource {
    }
    
    var delegate: Delegate?
    var dataSource: DataSource?
}

影响

这个提案对 Swift 开发的影响是显而易见的。首先,它提升了语言的表达力,使得开发者能够更自然地实现封装和模块化的设计。其次,它简化了一些设计模式的实现,使得代码更加清晰和易于理解。

总结

SE-0404 提案是 Swift Evolution 社区中的一个点赞量很高的提案,这个提案将显著增加 Swift 语言的灵活性和表达力,使得实现封装和模块化的设计变得更加简单。

目前这个提案的实现已经在 Swift 5.10 发布了,所以如果你的 Xcode 版本在 15.3 及以上,就已经支持了,可以试试看。

参考资料

1

SE-0404 嵌套协议: github.com/apple/swift...

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
茶底世界之下35 分钟前
阴天花摊不必变暖:用 Awaking 留住花色与湿街
ios·app·产品
Fatbobman(东坡肘子)15 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
chaoahyl16 小时前
WaterDiary 喝水记录 App 实战(2)· 实现喝水首页与本地保存
swift
茶底世界之下1 天前
斜光下的旧自行车:用 Awaking 留一版复古胶片色
ios·app·产品
2501_916008891 天前
iPhone 设备信息查看,用 KeyMob 看型号、序列号、电池健康和 UDID
android·ios·小程序·https·uni-app·iphone·webview
茶底世界之下2 天前
iPhone Duo 适配实战,Awaking 踩过的 8 个坑
ios·swiftui·swift
跨境数据猎手2 天前
HTTP 响应体编码与压缩:识别、解码
网络协议·http·ios
也非非也2 天前
iPhone 中国区 AI 落地:Apple 与阿里千问合作的技术观察
大数据·人工智能·ios·agent·iphone·智子
茶底世界之下2 天前
同一片泳池,清透还是奶油胶片?用 Awaking 做两版成片
ios
xbzb2 天前
Swift 对象存储建环实验 + Ceilometer 计量:两个收尾服务
swift·ring·实验·ceilometer·象存储·建环