在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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 = 988 let iRes = structObj.testFunc(4) let clsObj = CTset() clsObj.iAge = 987 let 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")
4:结构体是值类型 var objFirst = SForm(iXX:983, strHello:"hel") var objSecond = objFirst objSecond.iXX = 5775 println("objFirst: \(objFirst.iXX) objSecond:\(objSecond.iXX)") 5:类是引用类型。 let clsObj = CTset() clsObj.iAge = 987 var clsObjEx:CTset = clsObj clsObjEx.iAge = 874 println("\(clsObj.iAge) \(clsObjEx.iAge)") 6:类的等价于运算=== 与不等价于 !== 运算 。表示是否是引用到同一个类对象 let clsObj = CTset() clsObj.iAge = 987 var clsObjEx:CTset = clsObj clsObjEx.iAge = 874 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" 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 = 443 var dicFirst:Dictionary = ["key1":clsObjFirst] var dicSecond:Dictionary = dicFirst两个字典dicFirst 和 dicSecond分别为不同的字典,但它的值 clsObjFirst的地址却是同一个。因为它是类类型,是引用传递。
8.2数组的赋值与拷贝。数组的拷贝行为只有在数组的长度发生变化的时候才会拷贝。当然数组里面的内容,是要遵循引用类型还是值类型的。 var arrayFirst = [1, 33] var arraySecond = arrayFirst arraySecond[0] = 89 //arrayFirst[0]和arraySecond[0] 都会被修改成 89 因为数组长度没变化,所以没发生拷贝 var arrayFirst = [1, 33] var arraySecond = arrayFirst arrayFirst.append(222)//长度变化,arrayFirst拷贝,独立另外一个数组 arrayFirst[0] = 99 println("first:\(arrayFirst)\nsecond:\(arraySecond)") 输出: first:[99, 33, 222] second:[1, 33] 在用多个变量(var)引用一个数组时候,可以用unshare()方法,强制拷贝数组。 var arrayFirst = [1, 2] var arraySecond = arrayFirst var arrayThird = arrayFirst arraySecond.unshare()//拷贝独立成另外个数组 arrayThird.unshare()//拷贝独立成另外个数组 arrayFirst[0] = 3 arraySecond[0] = 4 arrayThird[0]=5 println("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] = 4 arrayCopy[1] = 5 println("source:\(arraySource)\n copy:\(arrayCopy)") 输出: source:[4, 2, 3] copy:[1, 5, 3]
|
请发表评论