`

swift 类和结构体

阅读更多
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")
//objSecond.iXX = 876 error

4:结构体是值类型

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

5:类是引用类型。

复制代码
let clsObj = CTset()
clsObj.iAge = 987
var clsObjEx:CTset = clsObj
clsObjEx.iAge = 874
println("\(clsObj.iAge)  \(clsObjEx.iAge)")
输出:clsObj: 874 clsObjEx: 874
复制代码

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"
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 = 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]
分享到:
评论

相关推荐

    swift菜鸟入门视频教程-09-类和结构体

    swift菜鸟入门视频教程-09-类和结构体

    Swift语言教程:Swift 结构体教程

    Swift语言教程:Swift 结构体教程

    swift代码-结构体的运用

    swift代码-结构体的运用

    Swift 结构体

    Swift 结构体 Swift 结构体是构建代码所用的一种通用且灵活的构造体。 我们可以为结构体定义属性(常量、变量)和添加方法,从而扩展结构体的功能。 与 C 和 Objective C 不同的是: 结构体不需要包含实现文件和...

    Swift 3.0基础学习之类与结构体

    最近在学swift 3.0,主要看的是苹果的官方文档,这里只是根据自己看官方文档的理解所做的一些记录,...下面这篇文章主要介绍了Swift 3.0基础学习之类与结构体的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。

    10Swift 字符.docx

    类和结构体:Swift支持类和结构体两种类型的定义,类似于其他面向对象的编程语言。类用于创建对象,结构体用于创建值类型。 可选类型:Swift引入了可选类型的概念,用于处理可能为nil的值。可选类型可以包含一个值...

    04Swift 常量.docx

    类和结构体:Swift支持类和结构体两种类型的定义,类似于其他面向对象的编程语言。类用于创建对象,结构体用于创建值类型。 可选类型:Swift引入了可选类型的概念,用于处理可能为nil的值。可选类型可以包含一个值...

    06Swift 运算符.docx

    类和结构体:Swift支持类和结构体两种类型的定义,类似于其他面向对象的编程语言。类用于创建对象,结构体用于创建值类型。 可选类型:Swift引入了可选类型的概念,用于处理可能为nil的值。可选类型可以包含一个值...

    02Swift 变量.docx

    类和结构体:Swift支持类和结构体两种类型的定义,类似于其他面向对象的编程语言。类用于创建对象,结构体用于创建值类型。 可选类型:Swift引入了可选类型的概念,用于处理可能为nil的值。可选类型可以包含一个值...

    08Swift 循环.docx

    类和结构体:Swift支持类和结构体两种类型的定义,类似于其他面向对象的编程语言。类用于创建对象,结构体用于创建值类型。 可选类型:Swift引入了可选类型的概念,用于处理可能为nil的值。可选类型可以包含一个值...

    详解Swift语言中的类与结构体

    主要介绍了Swift语言中的类与结构体,是Swift入门学习中的基础知识,需要的朋友可以参考下

    05Swift 字面量.docx

    类和结构体:Swift支持类和结构体两种类型的定义,类似于其他面向对象的编程语言。类用于创建对象,结构体用于创建值类型。 可选类型:Swift引入了可选类型的概念,用于处理可能为nil的值。可选类型可以包含一个值...

    07Swift 条件语句.docx

    类和结构体:Swift支持类和结构体两种类型的定义,类似于其他面向对象的编程语言。类用于创建对象,结构体用于创建值类型。 可选类型:Swift引入了可选类型的概念,用于处理可能为nil的值。可选类型可以包含一个值...

    09Swift 字符串.docx

    类和结构体:Swift支持类和结构体两种类型的定义,类似于其他面向对象的编程语言。类用于创建对象,结构体用于创建值类型。 可选类型:Swift引入了可选类型的概念,用于处理可能为nil的值。可选类型可以包含一个值...

    03Swift 可选(Optionals)类型.docx

    类和结构体:Swift支持类和结构体两种类型的定义,类似于其他面向对象的编程语言。类用于创建对象,结构体用于创建值类型。 可选类型:Swift引入了可选类型的概念,用于处理可能为nil的值。可选类型可以包含一个值...

Global site tag (gtag.js) - Google Analytics