InfoQ Geekathon 大模型技术应用创新大赛 了解详情
写点什么

使用值类型构建更好的 Swift 应用程序

  • 2015-08-06
  • 本文字数:1202 字

    阅读完需:约 4 分钟

在 WWDC2015 上,苹果工程师 Doug Gregor 和 Bill Dudney评价了Swift 对值类型的支持,并解释了如何通过它实现一种灵活的不可变性,以构建更好的应用。

Gregor 首先评价了 Objective-C 中常用的引用语义。引用语义的主要问题在于它有可能产生预期之外的对象共享行为,这种行为有可能导致对象的属性被暗中改动。Objective-C 程序员对此已经十分了解了,因为许多 Cocoa 和 Cocoa Touch 类,像 NSString、NSURLRequest,以及所有的集合调用时都需要拷贝。所以为了让程序员更易于进行防御性的拷贝,Objective-C 语言甚至为属性提供了一个 copy 特性,当给一个给定的属性分配对象时,运行时本身就会拷贝一个副本。

对于性能和内存的使用来说,防御性拷贝明显不是最优的措施,尤其在使用不当时更可能造成微妙的问题。

随后,Gregor 继续探索不可变性是否是这个问题的正确答案。许多 Cocoa 类,像 NSDate、NSURL、UIImage、NSNumber 和其它许多类都强制实施不可变性。根据 Gregor 的评价,不可变性拥有许多优点,比如没有副作用和可共享,但它也会生成尴尬的接口,并且不能有效地映射到机器模型。为了具体说明这一点,Gregor 在 Haskell 和 Swift 中分别运行 Eratosthenes 筛法来举例说明不可变性是如何牺牲性能的。

根据 Gregor 的评价,对值语义的使用正是这类问题的解决办法,而 Swift 完全支持这种值语义:

  • 所有的基本类型,比如 Int、Double、String 等都是值类型;
  • Swift 中的所有集合类型,比如 Array、Set 和 Dictionary 都是值类型;
  • 值类型可以进行组合,比如 tuples、structs 和 enums 仅包含值类型,因而它们自身也是值类型,从而可以根据值语义建立抽象类型。

值类型仅仅就是值,并且它们是不可变的。它们没有标识符,所以只能以值来区分。这就需要所有的值类型都遵守 Equatable 协议。

复制代码
protocol Equatable {
/// Reflexive - `x == x` is `true`
/// Symmetric - `x == y` then `y == x`
/// Transitive - `x == y` and `y == z` then `x == z`
func ==(lhs:Self, rhs:Self) -> Bool
}

此外,值类型允许应用程序根据需要在可变性和不可变性之间取得适当的平衡。Gregor 表示:实际上,你可以对值类型使用 let 关键字,以指定一个不会改变的变量,或者使用 var 来指定一个可以在不影响其它值的前提下更新自身的值的变量。

复制代码
let numbers = [1, 2, 3, 4]
var strings = [String]()
for x in numbers {
strings.append(String(x))
}

如前文所述,值类型是不可变的,所以它们只能被拷贝。但是,Gregor 说,它们的拷贝操作开销很低,对于简单的值类型,比如 Int、Double、CGPoint 等, 它们的拷贝时间是个常数。对于可扩展的数据结构,将会使用写时拷贝(copy-on-write)技术,只有当值改变时,才会建立一个副本,所以这种技术比默认拷贝方式更有效率。

此次演讲的第二部分专注于提供一个使用 Swift 值类型进行编程的动手实验示例。

查看英文原文: Building Better Swift Apps Using Value Types

活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2015-08-06 08:001125
用户头像

发布了 92 篇内容, 共 21.0 次阅读, 收获喜欢 4 次。

关注

评论

发布
暂无评论
发现更多内容

长安链源码分析之网络模块 net-liquid(6)

邂逅Vue3

渔戈

前端 Vue3 10月月更

长安链源码分析之网络模块 net-liquid(7)

SUSE 推出业界首个自适应 Linux 平台原型

Anthony

Linux 自适应

开源日志收集 肿么选型??

CTO技术共享

个人成长 log 10月月更

打破汽车零部件企业供应链壁垒,数商云SCM供应链系统实现一体化采购协同

数商云

数字化转型 供应链 企业数字化

NFT卡牌链游系统开发Web3游戏技术

薇電13242772558

dapp web3

外包和自研应该选择呢?教你三招选出最合适自己的平台

千锋IT教育

手把手教你成为荣耀开发者:如何进行注册与认证?

荣耀开发者服务平台

开发者 手机 新手指南 荣耀 honor

Vue组件是怎样挂载的

yyds2026

Vue

戴尔Precision 3660工作站:设计师手里的金刚钻

科技热闻

navicat的使用与数据库的DML操作

渔戈

MySQL SQL语句 10月月更

手把手完成智慧路灯的开发,完成设备上云【华为云IoT】

DS小龙哥

10月月更

知识经济时代,企业该如何进行知识管理?

Baklib

效率工具 知识管理 企业 知识 知识经济

【Java深入学习】一个关于“锁”的程序-上

Geek_65222d

10月月更

分布式事务-引出分布式事务

zarmnosaj

10月月更

工作四年,靠这份Java面试宝典,跳槽到阿里,月薪直涨12K

收到请回复

Java 面试 语言 & 开发 金九银十

华为架构师亲手操刀,世界五百强都在用的kafka也就那么回事

程序知音

Java kafka 架构 后端技术

ElasticSearch + Kibana for Kubernetes 硬气功实践 2

CTO技术共享

elasticsearch 个人成长 10月月更

SAP | abap的数据对象

暮春零贰

SAP 10月月更 数据对象

团队实现知识管理,先从知识库做起!

Baklib

效率 效率工具 知识管理 团队 知识

Vue模板是怎样编译的

yyds2026

Vue

30+场技术论坛 1000+科技新品发布 今年云栖大会我们关注什么?

阿里技术

云栖大会

Vue3的基本指令

渔戈

前端 Vue3 10月月更

Kubernetes fror Flink 硬气功实践

CTO技术共享

flink 个人成长 10月月更

分析服务用多维度、多场景的用户分层,带您深度玩转精细化游戏运营

HMS Core

分析

文本识别与检测-【技术白皮书】第三章-第二节: 基于分割的场景文本检测方法

合合技术团队

人工智能 神经网络 文字识别 自然语言理解

EMQ x 阿里云:云上高效构建,IoT 数据一站处理|直播预告

阿里云弹性计算

物联网 IoT 计算巢

秒云入选2022年成都市新经济梯度培育企业

秒云

成都市新经济梯度培育企业

ERP外贸管理系统是什么?哪家好?如何选?

优秀

外贸管理 ERP系统 ERP外贸管理系统

真·workshop,来自联通、移动、爱奇艺等14位资深专家与你面对面聊云原生硬核技术|2022云栖大会

OpenAnolis小助手

云原生 虚拟化 云栖大会 龙蜥社区 专场

  • 扫码添加小助手
    领取最新资料包
使用值类型构建更好的Swift应用程序_语言 & 开发_Sergio De Simone_InfoQ精选文章