swift 类和结构体

swift 类和结构体,第1张

概述1:类和结构体定义 类和结构体分别通过关键字class 和struct定义。 swift的编码风格是类class和结构体struct名字使用大写字母开头的匈牙利表示法,相反的。类的方法和属性则用小写字母开头的匈牙利表示法。 结构体总是通过被复制而进行代码传递的。 struct SForm{ var iXX:Int = 99 var strHello:String = "dsf" 1:类和结构体定义 类和结构体分别通过关键字class 和struct定义。 swift的编码风格是类class和结构体struct名字使用大写字母开头的匈牙利表示法,相反的。类的方法和属性则用小写字母开头的匈牙利表示法。 结构体总是通过被复制而进行代码传递的。
struct SForm{    var iXX:Int = 99    var strHello:String = "dsf"    func testFunc(iXX:Int)->Int{        return iXX+1    }}class CTset{    var iAge:Int = 9    var strname:String = "xx"    func testFunction(iAge:Int)->Int{        return iAge+1    }    func testFunctionname(strname:String)->String{        return "oo"+strname    }}

2:类和结构体实例

var structObj = SForm()structObj.iXX = 988let iRes = structObj.testFunc(4)
let clsObj = CTset()clsObj.iAge = 987let iRe:Int = clsObj.testFunction(32)let iStr:String = clsObj.testFunctionname("sdf")

3:结构体初始化

结构体有一个自动生成的初始化器。新实例中各个属性的初始值可以通过属性的名称传递到成员逐一初始化器之中。

var objFirst = SForm(iXX:983,strHello:"hel")objFirst.iXX = 87
let obJsecond = SForm(iXX:94,strHello:"hwxel")
//obJsecond.iXX = 876 error

4:结构体是值类型

var objFirst = SForm(iXX:983,strHello:"hel")var obJsecond = objFirstobJsecond.iXX = 5775println("objFirst: \(objFirst.iXX)  obJsecond:\(obJsecond.iXX)")
输出:objFirst: 983 obJsecond:5775

5:类是引用类型。

let clsObj = CTset()clsObj.iAge = 987var clsObjEx:CTset = clsObjclsObjEx.iAge = 874println("\(clsObj.iAge)  \(clsObjEx.iAge)")
输出:clsObj: 874 clsObjEx: 874

6:类的等价于运算=== 与不等价于 !== 运算 。表示是否是引用到同一个类对象

let clsObj = CTset()clsObj.iAge = 987var clsObjEx:CTset = clsObjclsObjEx.iAge = 874if clsObj === clsObjEx {    println("obj same")}

7:类和结构体区别。结构体是值类型,结构体的赋值意味着拷贝行为的发生。而类是引用类型。

8:集合类型的赋值和拷贝行为。

swift的数组和字典都是以值类型传递的。

8.1字典的拷贝。当有字典实例的赋值或者是字典做参数的函数调用时候,字典即发生拷贝行为。字典的key和value的拷贝行为是依赖于她自身到底是引用属性还是值类型。

var dicFirst:Dictionary = ["key1":"value1","key2":"value2"]var dicSecond:Dictionary = dicFirstdicSecond["key1"] = "value1Update"
dicSecond的值被更新,而dicFirst的值依然保持不变。dicFirst和dicSecond是两个独立的字典。它的key和value在赋值时候发生了拷贝,因为都是String类型。
class CTset{    var iAge:Int = 9    var strname:String = "xx"    func testFunction(iAge:Int)->Int{        return iAge+1    }    func testFunctionname(strname:String)->String{        return "oo"+strname    }}var clsObjFirst = CTset()clsObjFirst.iAge = 443var dicFirst:Dictionary = ["key1":clsObjFirst]var dicSecond:Dictionary = dicFirst两个字典dicFirst 和 dicSecond分别为不同的字典,但它的值 clsObjFirst的地址却是同一个。因为它是类类型,是引用传递。

8.2数组的赋值与拷贝。数组的拷贝行为只有在数组的长度发生变化的时候才会拷贝。当然数组里面的内容,是要遵循引用类型还是值类型的。

var arrayFirst = [1,33]var arraySecond = arrayFirstarraySecond[0] = 89@H_449_419@//@H_449_419@arrayFirst[0]和arraySecond[0] 都会被修改成 89 因为数组长度没变化,所以没发生拷贝
var arrayFirst = [1,33]var arraySecond = arrayFirstarrayFirst.append(222)@H_449_419@//@H_449_419@长度变化,arrayFirst拷贝,独立另外一个数组arrayFirst[0] = 99println("first:\(arrayFirst)\nsecond:\(arraySecond)")输出:first:[99,33,222]second:[1,33]

在用多个变量(var)引用一个数组时候,可以用unshare()方法,强制拷贝数组。

var arrayFirst = [1,2]var arraySecond = arrayFirstvar arrayThird = arrayFirstarraySecond.unshare()@H_449_419@//@H_449_419@拷贝独立成另外个数组arrayThird.unshare()@H_449_419@//@H_449_419@拷贝独立成另外个数组arrayFirst[0] = 3arraySecond[0] = 4arrayThird[0]=5println("first:\(arrayFirst)\nsecond:\(arraySecond) \nthird:\(arrayThird)")输出:first:[3,2]second:[4,2] third:[5,2]

8.3 数组等价于(===)和不等价于(!==)

8.4强制复制数组

通过copy强制复制数组,进行的是数组类容浅拷贝,并返回个新的数组引用。

var arraySource = [1,2,3]var arraycopy = arraySource.copy()arraySource[0] = 4arraycopy[1] = 5println("source:\(arraySource)\n copy:\(arraycopy)")输出:source:[4,3] copy:[1,5,3]
总结

以上是内存溢出为你收集整理的swift 类和结构体全部内容,希望文章能够帮你解决swift 类和结构体所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1084518.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)