首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Swift 进阶: 隐式打开存在类型

  • 24-12-12 11:47
  • 3845
  • 5101
juejin.cn

引言

大家好,我是一牛,今天我为大家介绍一个概念 - 隐式打开存在类型。在介绍它之前,我们先来回顾一下存在类型。

存在类型也就是装箱类型,在Swift中使用any关键字修饰,它存储的值的具体类型是未知的,这个具体类型可能会在运行时变化。

隐式打开存在类型

考察以下代码

swift
代码解读
复制代码
protocol P { associatedtype A func getA() -> A } func openSimple<T: P>(_ value: T) {} func testOpenSimple(p: any P) { openSimple(p) }

在 Swift 5.7 之前,这段代码在编译时会报错,Type 'any P' cannot conform to 'P', 相信这个错误在当时困扰了一批iOSer 。困惑就是any P竟然没遵守P协议,也就是说存在类型是没有遵守P协议的,尽管它存储的值遵守了该协议。openSimple 这个方法的参数是泛型参数,需要在编译时确定特定类型,所以需要在编译时打开存在类型。Swift 5.7 为了解决这一问题,提出了隐式打开存在类型 - 将存在类型存储的值类型绑定到泛型参数。所以在 Swift 5.7 后这段代码能够被正确编译。

注意 隐式打开存在类型的参数仅在调用中发生,调用结束时可以进行类型擦除。

何时能打开存在类型

当存在类型的底层类型可以绑定到一个具体的泛型参数时,我们就可以打开这个存在类型,比如我们还可以打开元类型。

考察以下代码

swift
代码解读
复制代码
func openMetaSimple<T: P>(_ value: T.Type) {} func testopenMetaSimple(_ value: any P.Type) { openMetaSimple(value) }

我们还可以打开 inout类型

swift
代码解读
复制代码
func openInOut<T: P>(_ value: inout T) { } func testOpenInOut(p: any P) { var mutableP: any P = p openInOut(&mutableP) }

打开存在类型的限制

然而隐式打开存在类型还存在很多限制,考察以下代码

swift
代码解读
复制代码
struct S<T: P> { var s: T } func testopenExistential(p: any P) { let _ = S(s: p) //error: any P' cannot conform to 'P' }

熟悉的错误 Type 'any P' cannot conform to 'P'又回来了,究其原因是这里使用了初始化办法,这里的初始化方法相当于一个泛型方法 make() (s: T) -> S, 对于返回值是动态类型, Swift 限制了打开操作。

规则 当有两个和两个以上的存在类型的值时,或者根本没有值,我们不能进行打开操作,因为我们不能推断出一个底层类型

swift
代码解读
复制代码
func cannotOpen1<T: P>(_ array: [T]) {} func testCannotOpenMultiple(array: [any P]) { cannotOpen1(array)//error: any P' cannot conform to 'P' }

array中可能存在不同类型的值,我们不能推断出一个底层类型,不能打开存在类型。

结语

隐式打开存在类型是 Swift 5.7 引入的重要特性,它帮助我们更灵活地在代码中处理存在类型,使得泛型代码可以与存在类型顺畅配合。这项特性减少了编写泛型代码时需要手动解包存在类型的复杂性,尤其在处理协议和泛型参数时,显著提升了代码的可读性和易用性。

虽然隐式打开存在类型大大简化了代码,但我们仍需注意其使用限制。当存在类型的底层类型无法确定时,如存在多个值或没有值时,隐式打开操作是无法进行的。了解这些限制,有助于我们在开发中避免潜在的编译错误,并写出更健壮、可维护的代码。

希望通过这篇文章,你对隐式打开存在类型的概念和用法有了清晰的理解。欢迎在评论区分享你的看法或提出问题,让我们一起探讨 Swift 编程中的新特性!

创作不易,欢迎大家点赞收藏。

相关资料:

深入理解不透明类型与装箱类型

Implicitly opened existentials

注:本文转载自juejin.cn的一牛的文章"https://juejin.cn/post/7446683086430289930"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

141
iOS
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top