Swift开发——存储属性与计算属性

简介: Swift推荐使用结构体进行开发,结构体支持属性和方法,且作为值类型。结构体属性包括存储属性(如radius)和计算属性(如r),计算属性不存储值,类似方法。结构体用`struct`定义,命名遵循大驼峰规则。实例名遵循小驼峰规则。属性可在结构体中任意位置定义,静态属性用`static`。存储属性可为`lazy`实现懒加载。结构体实例通过`.`访问属性和方法,静态属性和方法用`结构体名.`访问。计算属性可读写,可通过`get`和`set`定义。程序段1展示了结构体Point和Circle的属性和方法,包括私有属性、只读计算属性、可读写计算属性及`mutating`方法。

image.png


Swift语言开发者建议程序设计者多用结构体开发应用程序。在Swift语言中,结构体具有了很多类的特性(除类的与继承相关的特性外),具有属性和方法,且为值类型。所谓的属性是指结构体中的变量或常量,所谓的方法是指结构体中的函数。在结构体中使用属性和方法是因为:①匹别于结构体外部定义的变量和常量;②从面向对象程序设计的角度,结构体对应着现实世界的一个客观物体,描述这个物体的性质需要用到它的属性和方法;③结构体定义的常量或变量称为实例,实例内部的变量或常量成员称为属性,实例内部的函数成员称为方法,这种称谓比常规含义的变量、常量和函数更具有意义。

定义结构体需使用关键字struct,结构体名建议使用“大骆驼命名法”,即首字母大写且其中的完整英文单词的首字母也大写。结构体定义的实例名建议使用“小骆驼命名法”,即首字母小写且其中的完整英文单词的首字母大写。结构体是一种类型,其中定义的属性和方法的位置可任意放置,可以先定义属性,再定义方法;也可以先定义方法,再定义属性。典型的结构体定义形式如下:

image.png


上述代码定义了一个结构体类型,名称为Circle,具有一个属性radius和一个方法area。一般地,在结构体中定义属性时需要为属性赋初始值,或者使用初始化器为结构体的各个属性赋初始值。属性分为两种,一种为存储类型的属性,如上述的radius属性;另一种为计算类型的属性,这种属性的行为类似于方法,但是形式是属性。结构体为值类型,如果结构体中定义的方法修改了其中的属性,需要使用关键字mutating修饰该方法,这种方法将为属性创建临时存储空间,待方法执行完后,将临时存储空间的值赋回给需要修改的属性。

结构体定义的变量或常量称为实例,实例调用属性和方法时使用“实例.属性”或“实例.方法(实际参数列表)”的形式。除了属于实例的属性和方法外,还可以定义属于结构体的属性和方法,借助static关键字定义,使用形式“结构体名.属性”或“结构体名.方法(实际参数列表)”访问这类属性和方法。
# 01、存储属性与计算属性
在结构体中,属性有以下三种类型:

(1) 使用static定义的静态属性,称为结构体属性,这类属性采用“结构体名.结构体属性名”的方式访问,如程序段5-9的第26行所示;

(2) 存储属性,又可称为动态属性,在结构体中定义的常量和变量均属于存储属性,存储属性为实例属性,采用“实例名.存储属性名”的方式访问;

(3) 计算属性,也属于实例属性,采用“实例名.计算属性名”的方式访问,但是计算属性本身不保存属性值,与存储属性不同之处在于在定义计算属性后添加一对“{ }”,在其中添加get方法和set方法(至少要添加get方法),依次用于获取存储属性值或设置存储属性值。

对于存储属性:①当使用private修饰时将变成私有存储属性,这类私有存储属性只能借助计算属性间接访问,不能借助实例访问,从而实现了数据“封装”特性;②当使用lazy修饰时将变成惰性存储属性,这类惰性存储属性必须为变量类型,当它被首次使用时才初始化,即如果惰性存储属性只定义了但没有使用,则该属性不会占用存储空间。

程序段1详细介绍了存储属性、计算属性和私有存储属性的用法。

程序段1结构体的属性用法实例

image.png


image.png


程序段1的执行结果如图1所示。

image.png


■ 图1 程序段1的执行结果

下面结合图1介绍程序段1。在程序段1中,第3~6行定义了结构体Point,具有两个存储属性x和y。

第7~34行定义结构体Circle。其中第9行“var radius=1.0”定义存储属性radius,并赋初值为1.0。一般地,在结构体内定义存储属性时需给它们赋初值。第10~20行定义了计算属性r,将其代码再次罗列如下:

image.png


计算属性r更像是一个方法,具有“{ }”括起来的可执行代码。其中,第12~15行为get方法,这是一种程序员约定的名称,因为这种方法形如“get{ }”,get方法用于返回结构体中某个设定的存储属性的值,这里第14行返回存储属性radius的值,即读取r相当于读取radius。第16~19行为set方法,这也是一种程序员约定的名称,因为这种方法形式“set{ }”,set方法用于向某个选定的存储属性赋值,这里第18行向radius赋值,其中,newValue为关键字,自动保存赋给r的值,因此,向r赋值(即写r)就是向radius赋值(即写radius)。注意:①如果计算属性只有get方法,则去掉set部分,同时,get和“{ }”也可省略,如第22~25行的计算属性c,此时的计算属性为只读属性;②计算属性可以只有get方法,称为只读属性;可以同时有get方法和set方法,称为可读可写属性;但是不能只有set方法,即没有只写属性;③在set方法中可以使用newValue关键字,用于表示赋给计算属性的值,也可以自定义该量,例如第16~19行的代码可以替换为下述代码:

image.png


这里使用了自定义的val变量,此处无须指定数据类型,而是根据计算属性r的类型自动推断数据类型。

第21行“private var center=Point(x:0, y:0)”定义私有存储属性center,这类属性只能借助计算属性访问,同时这类属性可被结构内的其余属性和方法使用,但不能被结构体外部的方法调用,结构体定义的实例也不能访问这类属性。

第22~25行定义一个计算属性c,其代码再次罗列如下:

image.png


这里计算属性c为一个只读属性,省略了get和“{ }”,返回center的值,即读取c相当于读取center。

第26~29行定义了函数moveTo,使用了mutating关键字,因为该函数将修改私有存储属性center的值。第28行“center=point”将参数point赋给私有存储属性center。

第30~33行定义了函数area,返回值为Double类型,函数返回圆的面积。第32行“return 3.14rr”使用了计算属性r,因为计算属性r为可读可写属性,这里读取r相当于读取radius。

第36行“var circle=Circle()”定义结构体实例circle。第37行“circle.r=5.0”将5.0赋给实例circle的计算属性r,计算属性r并不保存值,其内部将5.0赋给存储属性radius。第38行“print("radius=\(circle.r)")”输出存储属性radius的值,得到“radius=5.0”。第39行“circle.moveTo(point:Point(x:3.0, y:4.0))”调用moveTo方法将圆心移动到点(3.0, 4.0)处。第40行“print("Circle at (\(circle.c.x),\(circle.c.y))",terminator:" ")”和第41行“print("with area:\(String(format:"%5.2f",circle.area()))")”联合输出“Circle at (3.0,4.0) with area:78.50”,其中,第40行通过只读的计算属性c,获取圆心坐标。

目录
相关文章
|
7天前
|
机器学习/深度学习 TensorFlow Swift
Swift语言适合多个领域的开发
Swift语言适合多个领域的开发
31 9
|
7天前
|
安全 编译器 Swift
Swift开发
Swift开发
27 9
|
9天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
29 9
|
14天前
|
存储 监控 Swift
Swift 属性
10月更文挑战第29天
24 2
|
22天前
|
安全 API Swift
探索iOS开发中的Swift语言之美
【10月更文挑战第23天】在数字时代的浪潮中,iOS开发如同一艘航船,而Swift语言则是推动这艘船前进的风帆。本文将带你领略Swift的独特魅力,从语法到设计哲学,再到实际应用案例,我们将一步步深入这个现代编程语言的世界。你将发现,Swift不仅仅是一种编程语言,它是苹果生态系统中的一个创新工具,它让iOS开发变得更加高效、安全和有趣。让我们一起启航,探索Swift的奥秘,感受编程的乐趣。
|
1月前
|
安全 Swift iOS开发
探索iOS开发中的Swift语言之美
在数字时代的浪潮中,移动应用已成为日常生活的延伸。本文将深入探讨iOS平台上的Swift编程语言,揭示其背后的设计哲学、语法特性以及如何利用Swift进行高效开发。我们将通过实际代码示例,展示Swift语言的强大功能和优雅简洁的编程风格,引导读者理解并运用Swift解决实际问题。
|
2月前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
46 4
|
2月前
|
安全 编译器 Swift
探索iOS开发之旅:Swift编程语言的魅力与挑战
【9月更文挑战第5天】在iOS应用开发的广阔天地中,Swift作为苹果官方推荐的编程语言,以其简洁、高效和安全的特点,成为了开发者的新宠。本文将带领你领略Swift语言的独特魅力,同时探讨在实际开发过程中可能遇到的挑战,以及如何克服这些挑战,成为一名优秀的iOS开发者。
|
2月前
|
设计模式 前端开发 Swift
探索iOS开发:Swift与Objective-C的较量
在这篇文章中,我们将深入探讨iOS开发的两大编程语言——Swift与Objective-C。我们将分析这两种语言的特性、优势和局限性,并讨论它们在现代iOS开发中的应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和建议。
57 3
|
3月前
|
移动开发 安全 Swift
探索iOS开发:从零开始的Swift之旅
【8月更文挑战第31天】本文将带你开启一段Swift编程语言的奇幻旅程,通过简单易懂的方式介绍Swift的基本概念和编程实践。我们将一起构建一个简单的iOS应用,体验从代码到界面的转变。无论你是编程新手还是希望扩展技能的开发者,这篇文章都会为你提供宝贵的知识和启发。