swift 类和结构体
struct SForm{
var iXX:Int =
var strHello:String = "dsf"
func testFunc(iXX:Int)->Int{
return iXX+
}
}
class CTset{
var iAge:Int =
var strName:String = "xx"
func testFunction(iAge:Int)->Int{
return iAge+
}
func testFunctionName(strName:String)->String{
return "oo"+strName
}
}
2:类和结构体实例
var structObj = SForm()
structObj.iXX =
let iRes = structObj.testFunc()
let clsObj = CTset()
clsObj.iAge =
let iRe:Int = clsObj.testFunction()
let iStr:String = clsObj.testFunctionName("sdf")
3:结构体初始化
结构体有一个自动生成的初始化器。新实例中各个属性的初始值可以通过属性的名称传递到成员逐一初始化器之中。
var objFirst = SForm(iXX:, strHello:"hel")
objFirst.iXX = 87
let objSecond = SForm(iXX:94, strHello:"hwxel")
//objSecond.iXX = 876 error
4:结构体是值类型
var objFirst = SForm(iXX:, strHello:"hel")
var objSecond = objFirst
objSecond.iXX =
println("objFirst: \(objFirst.iXX) objSecond:\(objSecond.iXX)")
输出:objFirst: 983 objSecond:5775
5:类是引用类型。
let clsObj = CTset()
clsObj.iAge =
var clsObjEx:CTset = clsObj
clsObjEx.iAge =
println("\(clsObj.iAge) \(clsObjEx.iAge)")
输出:clsObj: 874 clsObjEx: 874
6:类的等价于运算=== 与不等价于 !== 运算 。表示是否是引用到同一个类对象
let clsObj = CTset()
clsObj.iAge =
var clsObjEx:CTset = clsObj
clsObjEx.iAge =
if clsObj === clsObjEx {
println("obj same")
}
7:类和结构体区别。结构体是值类型,结构体的赋值意味着拷贝行为的发生。而类是引用类型。
8:集合类型的赋值和拷贝行为。
swift的数组和字典都是以值类型传递的。
8.1字典的拷贝。当有字典实例的赋值或者是字典做参数的函数调用时候,字典即发生拷贝行为。字典的key和value的拷贝行为是依赖于她自身到底是引用属性还是值类型。
var dicFirst:Dictionary = ["key1":"value1", "key2":"value2"]
var dicSecond:Dictionary = dicFirst
dicSecond["key1"] = "value1Update"
dicSecond的值被更新,而dicFirst的值依然保持不变。dicFirst和dicSecond是两个独立的字典。它的key和value在赋值时候发生了拷贝,因为都是String类型。
class CTset{
var iAge:Int =
var strName:String = "xx"
func testFunction(iAge:Int)->Int{
return iAge+
}
func testFunctionName(strName:String)->String{
return "oo"+strName
}
}
var clsObjFirst = CTset()
clsObjFirst.iAge =
var dicFirst:Dictionary = ["key1":clsObjFirst]
var dicSecond:Dictionary = dicFirst两个字典dicFirst 和 dicSecond分别为不同的字典,但它的值 clsObjFirst的地址却是同一个。因为它是类类型,是引用传递。
8.2数组的赋值与拷贝。数组的拷贝行为只有在数组的长度发生变化的时候才会拷贝。当然数组里面的内容,是要遵循引用类型还是值类型的。
var arrayFirst = [, ]
var arraySecond = arrayFirst
arraySecond[] =
//arrayFirst[0]和arraySecond[0] 都会被修改成 89 因为数组长度没变化,所以没发生拷贝
var arrayFirst = [, ]
var arraySecond = arrayFirst
arrayFirst.append()//长度变化,arrayFirst拷贝,独立另外一个数组
arrayFirst[] =
println("first:\(arrayFirst)\nsecond:\(arraySecond)")
输出:
first:[, , ]
second:[, ]
在用多个变量(var)引用一个数组时候,可以用unshare()方法,强制拷贝数组。
var arrayFirst = [, ]
var arraySecond = arrayFirst
var arrayThird = arrayFirst
arraySecond.unshare()//拷贝独立成另外个数组
arrayThird.unshare()//拷贝独立成另外个数组
arrayFirst[] =
arraySecond[] =
arrayThird[]=
println("first:\(arrayFirst)\nsecond:\(arraySecond) \nthird:\(arrayThird)")
输出:
first:[, ]
second:[, ]
third:[, ]
8.3 数组等价于(===)和不等价于(!==)
8.4强制复制数组
通过copy强制复制数组,进行的是数组类容浅拷贝,并返回个新的数组引用。
var arraySource = [, , ]
var arrayCopy = arraySource.copy()
arraySource[] =
arrayCopy[] =
println("source:\(arraySource)\n copy:\(arrayCopy)")
输出:
source:[, , ]
copy:[, , ]
swift 类和结构体的更多相关文章
- swift 类 与 结构体
这两天突然有人问我 swift里面 类和 结构体 有什么区别? 说实在的本人目前不太看好swift,相信很多人也是,oc 都 很成熟了. 本人目前不打算深入了解swift的原因swift 语言 ...
- Swift类与结构体
类和结构体有很多共性: 定义属性存储数据 定义方法执行功能处理 定义下标,通过下标访问他们的值 初始化他们的状态 通过扩展(Extension)扩展其功能 遵守协议(Protocol),协议提供一种特 ...
- Swift: 类与结构体
对比类与结构体 类与结构体有许多的相同点,它们都可以: 定义属性来存储值: 定义方法来提供功能: 定义下标操作: 定义初始化函数: 扩展它的默认的实现: 遵从协议: 类有一些额外的能力,但是结构体没有 ...
- Swift类和结构体定义-备
Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 { 定义类的成员 } struct 结构体名 { ...
- Swift类和结构体
在C++中,相信不会有太多人去详细考究结构体和类的区别,因为二者关系实在不大.但在Swift中,结构体和类的关系非常大,它们的组成部分都包括:初始化器.实例方法.实例属性.类型属性.类型方法等等:二者 ...
- Swift 类和结构体的简单认识
类和结构体的共同点: 定义属性用于存储值 定义方法用于提供功能 定义附属脚本用于访问值 通过拓展增加默认实现的功能 定义构造器用于生成初始化值 实现协议以提供某种标准功能 类是引用类型 结构体是值类型 ...
- Swift - 类和结构体的区别
类和结构体有许多相同之处,也有许多不同之处. 二者区别如下: 1,类可以继承和扩展,结构体不可以 2,可以让一个类的实例来反初始化,释放存储空间,结构体做不到 3,类的对象是引用类型,而结构体是值类型 ...
- swift学习笔记3——类、结构体、枚举
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- 【Swift学习】Swift编程之旅---类和结构体(十三)
与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意:通常一个类 ...
随机推荐
- Kali Linux系列教程之OpenVas安装
Kali Linux系列教程之OpenVas安装 文 /玄魂 目录 Kali Linux系列教程之OpenVas安装 前言 1. 服务器层组件 2.客户层组件 安装过程 Initial setup ...
- ViEmuVS2013-3.2.1 破解
VS升级到2013后,作为一个Vimer,自然需要更新最新的ViEmu插件,因为现在离了Vim,写代码已经寸步难行了. ViEmu 3.2.1的破解其实和Viemu 3.0.13的破解方法一样.安装前 ...
- Cacti学习笔记一:基本安装和配置
1.安装依赖包 yum -y install net-snmp-devel mysql mysql-devel openssl-devel libtool 2.安装RRDTool yum -y ins ...
- hive函数总结
转自:http://www.cnblogs.com/end/archive/2012/06/18/2553682.html 1.内置运算符1.1关系运算符 运算符 类型 说明 A = B 所有原始类型 ...
- centos 6.4 /var/log/secure 不记录日志的問題
先确保日志服务开启:不妨重启下日志服务:由于目前RHEL 6/centos 6已经使用rsyslog替换了syslog.,所以不要在找/etc/syslog.conf了:重启命令:/etc/init. ...
- JS中的各种检测
//null 只在肯定返回null值时才使用null比较 var element = document.getElementById("my-div"); if (element ...
- CSS等高布局
做一些后台项目,和一下带侧边栏项目的时候登高布局很常用,总结了下有几种 1.margin-bottom方法 这里直接介绍我认为的最佳的侧边栏/分栏高度自动相等方法.核心的CSS代码如下(数值不固定): ...
- python3 crypto winrandom import error
早就听说3的包很成熟了,自从从2.7过渡上来后还是碰到各种不适应,可以想象更早的时候问题该要多么多,特别一些必备库经典库如果没有跟进得多痛苦. [code lang="python" ...
- 【linux】如何将Vim打造成一个成熟的IDE
如果你稍微写过一点代码,就能知道“集成开发环境”(IDE)是多么的便利.不管是Java.C还是Python,当IDE会帮你检查语法.后台编译,或者自动导入你需要的库时,写代码就变得容易许多.另外,如果 ...
- c++中typename和class的区别介绍
"typename"是一个C++程序设计语言中的关键字.相当用于泛型编程时是另一术语"class"的同义词.这个关键字用于指出模板声明(或定义)中的非独立名称( ...