Swift学习笔记:类和结构
一、类和结构的异同
类和结构有一些相似的地方。它们都能够:
1. 定义一些能够赋值的属性;
2. 定义具有功能性的方法
3. 定义下标。使用下标语法
4. 定义初始化方法来设置初始状态
5. 在原实现方法上的可扩展性
依据协议提供某一特定类别的基本功能
1. 类另一些结构不具备的特性:
2. 类的继承性
3. 对类实例实时的类型转换
4. 析构一个类的实例使之释放空间
5. 引用计数,一个类实例能够有多个引用
1. 定义语法
struct Name{
let firstName = ""
let secondName = ""
}
class Student{
var name = Name()
var height = 0.0
var score = 0
}
let a = Student()
如代码所看到的,我们定义了一个结构体Name和一个类Student。在定义结构体和类的过程中有下面几点须要注意
注意:
① 基于书写规范。结构体和类的定义最好首字母大写
② 结构体和类的定义中,每一个属性均须要给出默认值,否则编译器会报错
2. 訪问属性以及结构类型初始化
let name1 = Name(firstName:"小",secondName:"本狼")
let a = Student()
a.name = name1;
a.height = 185
上面的代码中。首先我们初始化了Name结构体的一个实例name1,然后初始化了Student类的实例,并对这个实例进行赋值。重点有下面几个方面
重点:
① 结构体的初始化能够像调用外部函数一样。通过属性名称指定初始值
② 属性的訪问,在实例后加上“.”再加上属性名称就可以訪问属性
注意:
① 和结构不同。类实例不可以使用成员初始化方法。类的初始化会在后面专门介绍
② 和Objective-C不同,Swift可以直接设置一个结构属性的子属性
二、结构和枚举类型是数值类型
数值类型是说当它被赋值给一个常量或者变量,或者作为參数传递给函数时,是完整地复制了一个新的数值。而不是只改变了引用对象。
struct Name{
var firstName = ""
var secondName = ""
}
var a = Name(firstName:"小",secondName:"笨狼")
var b = a
a.firstName = "大"
println(b.firstName) //输出:小
如上面的样例所看到的,结构类型的赋值是完整的创建一个新的值,原来对象改变不会对赋值对象产生不论什么影响
三、类是引用类型
和结构类型不一样。类是属于引用类型,类的赋值仅仅是用引用赋值
struct Name{
var firstName = ""
var secondName = ""
}
class Student{
var name = Name()
var height = 0
var score = 0
}
let a = Student()
let b = a
a.score = 98
println(b.score) //输出:98
如上面的样例所看到的,将a对b赋值,a的属性改变。b的属性也会随之改变。由于a和b是2个指针,他们都指向同一地址
四、特征操作
推断2个对象是否指向同一个实例地址。须要用===和!
==来推断
let a = Student()
let b = a
if a === b{
println("a=b")
}else{
println("a != b")
} //输出 a=b
如上面的代码所看到的。a和b指向同一个实例,会输出a=b。
注意:
① 这并非推断他们是否属于同一个类。假设b是Student类的还有一个实例。则会不相等
② 不能使用==。编译器会报错
五、怎样选择使用类还是结构
在代码中能够选择类或者结构来实现你所须要的代码块,完毕对应的功能。
可是结构实例传递的是值。而类实例传递的是引用。那么对于不同的任务,应该考虑到数据结构和功能的需求不同,从而选择不同的实例。
一般来说,以下的一个或多个条件满足时,应当选择创建一个结构:
1. 结构主要是用来封装一些简单的数据值
2. 当赋值或者传递的时候更希望这些封装的数据被赋值。而不是被引用过去
3. 全部被结构存储的属性本身也是数值类型
4. 结构不须要被另外一个类型继承或者完毕其他行为
在其他情况下,类会是更好的选择。
也就是说普通情况下,数据都会定义为类
六、集合类型的赋值和复制操作
和Objective-C不一样,Swift中。数组Array和字典Dictionary是用结构来实现的,以下我们来看看他们详细有什么不一样的地方
1. 字典的赋值和复制操作
var ages = ["Peter": 23, "Wei": 35, "Anish": 65, "Katya": 19]
var copiedAges = ages
ages["Wei"] = 0
println(ages) //输出:[Anish: 65, Wei: 0, Peter: 23, Katya: 19]
println(copiedAges) //输出:[Anish: 65, Wei: 35, Peter: 23, Katya: 19]
因为字典是数值类型,赋值的时候会完整的赋值。
假设字典中的键值是数值类型(结构或者枚举),它们在赋值的时候会同一时候被复制。相反,假设是引用类型(类或者函数),引用本身将会被复制,而不是类实例或者函数本身。字典的这样的复制方式和结构同样。
2. 数组的赋值和复制操作
和字典Dictionary类型比起来。数组Array的赋值和复制操作就更加复杂。
Array类型和C语言中的类似,只只会在须要的时候才会完整复制数组的值。
假设将一个数组赋值给一个常量或者变量,或者作为一个參数传递给函数,复制在赋值和函数调用的时候并不会发生。这两个数组将会共享一个元素序列,假设你改动了当中一个,另外一个也将会改变。
对于数组来说,复制仅仅会在你进行了一个可能会改动数组长度操作时才会发生。
包含拼接,加入或者移除元素等等。当复制实际发生的时候,才会像字典的赋值和复制操作一样。
var a = [1,2,3]
var b = a
a[0] = 5
println(a) //输出:[5, 2, 3]
println(b) //输出:[5, 2, 3]
a.append(4)
println(a) //输出:[5, 2, 3, 4]
println(b) //输出:[5, 2, 3]
如上面样例所看到的:
1. 在将b用a赋值。在仅改变数组中值。不改变长度的情况下。数组不会进行复制。b会随着a改变。
2. 在改变长度的情况下,会进行复制,b将是一个新的数组。不会随着a改变
3.
数组独立
在数组赋值时,假设不想两个变量公用一个数组,能够用unsharekeyword来使数组独立。
var a = [1,2,3]
var b = a
a.unshare()
b[0] = 5
println(a) //输出:[1, 2, 3]
println(b) //输出:[5, 2, 3]
重点:
① 在调用a.unshare()方法时,会对a数组进行复制,然后让a指向复制数组。其它的指针还指向原对象
4. 推断2个数组是否指向同一数组地址
推断2个数组是否指向同一数组地址能够使用===和!==
var a = [1,2,3]
var b = a
if a === b{ }
注意:
假设对a或者b调用unshare之后。
他们就不再指向同一数组地址了
5. 强制数组拷贝
假设想要将数组完整拷贝到一个新数组中。能够使用copy方法
var a = [1,2,3]
var b = a.copy()
注意:
①这时候a和b数组是2个不相关的数组,改变值不会对对方有不论什么影响
②假设你不确定你须要的数组是否是独立的。那么只使用unshare就能够了。而copy方法无论当前是不是独立的,都会完整拷贝一次,哪怕这个数组已经是unshare的了。
Swift学习笔记:类和结构的更多相关文章
- Swift 学习笔记 (类和结构体)
类和结构体是一种多功能且灵活的构造体.通过使用与现存常量 变量 函数完全相同的语法来在类和结构体中定义属性和方法以添加功能. Swift中不需要你为自定义的类和结构体创建独立的结构和实现文件.在Swi ...
- swift 学习- 10 -- 类和结构体
// '类和结构体' 是人们构建代码所使用的一种通用且灵活的构造体, 我们可以使用完全相同的语法规则来为 '类和结构体' 定义属性 (变量 和 常量) 和添加方法, 从而扩展 类和结构体 的功能 // ...
- Swift学习笔记(11)--类与结构体
类与结构是编程人员在代码中会经常用到的代码块.在类与结构中可以像定义常量,变量和函数一样,定义相关的属性和方法以此来实现各种功能. 和其它的编程语言不太相同的是,Swift不需要单独创建接口或者实现文 ...
- Swift语法学习之 类和结构体
类和结构体 本页包括内容: 类和结构体对照 结构体和枚举是值类型 类是引用类型 类和结构体的选择 集合(collection)类型的赋值与复制行为 与其他编程语言所不同的是,Swift 并不要求你为自 ...
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- thinkphp学习笔记1—目录结构和命名规则
原文:thinkphp学习笔记1-目录结构和命名规则 最近开始学习thinkphp,在下不才,很多的问题看不明白所以想拿出来,恕我大胆发在首页上,希望看到的人能为我答疑解惑,这样大家有个互动,学起来快 ...
- Go语言学习笔记十: 结构体
Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...
- matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields
一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...
- Swift学习笔记(一)搭配环境以及代码运行成功
原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...
- 《python基础教程(第二版)》学习笔记 类和对象(第7章)
<python基础教程(第二版)>学习笔记 类和对象(第7章) 定义类class Person: def setName(self,name): self.name=n ...
随机推荐
- Oracle EBS-SQL (BOM-10):检查有BOM无计划员的数据.sql
select DISTINCT msi.segment1 编码 ,msi.description 描述 ,msi.item_type 物料类型 ,msi.inventory_ ...
- jdk7和8的一些新特性介绍
jdk7和8的一些新特性介绍 本文是我学习了解了jdk7和jdk8的一些新特性的一些资料,有兴趣的大家可以浏览下下面的内容. 官方文档:http://www.oracle.com/technetwor ...
- 【HDU】4923 Room and Moor(2014多校第六场1003)
Room and Moor Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) ...
- 【Struts2学习笔记(1)】Struts2中Action名称的搜索顺序和多个Action共享一个视图--全局result配置
一.Action名称的搜索顺序 1.获得请求路径的URI,比如url是:http://server/struts2/path1/path2/path3/test.action 2.首先寻找namesp ...
- 通过xib创建控制器
什么时候才需要使用storyboard,xib,当控制器的view界面是固定死的时候,就考虑用storyboard,xib解决. 目的:让xib描述控制器view 通过xi ...
- User cannot be resolved to a type
出现 User cannot be resolved to a type 不知道具体问题出在哪里但是我经过将全路径输入并保存后错误消失 将User选上,然后点击保存就可以了! 最后我发现错误消失了!
- 教你如何利用初级C#语言更改银行存款!!!!
您是否对生活现状不满意? 您是否总是感叹工资太少? 您是否经常发现自己相中的物品又降价了然而自己却还是只能望洋兴叹? 没关系!让我来拯救你的钱包! 接下来进入正题: 要想更改自己的银行存款首先得找到一 ...
- read和onload jquery.val
$(document).load(); 当web页面以及其附带的资源文件,如CSS,Scripts,图片等,加载完毕后执行此方法.常用于检测页面(及其附带资源)是否加载完毕. $(document). ...
- split 函数自己实现
要求自己实现split函数 def mySplit(str,delimiter): result = [] start = 0 pos = str.find(delimiter, start) whi ...
- iis7.0/8.0rewrite规则
首先在网站 web.config 配置文件的 configuration 节点中加入如下代码: <system.webServer> <rewrite> <rules&g ...