swift2.0 学习笔记six

//类和结构体

//共同点:1.定义属性用于存储值 2.定义方法用于提供功能

//3.定义构造器用于生成初始化值 4.通过扩展以增加默认实现的功能

//5.实现协议以提供某种标准功能


//类的附加功能有:1.继承允许一个类继承另一个类的特征

//2.类型转换允许在运行时检查和解释一个类实例的类型

//3.允许一个类实例释放任何其所被分配的资源

//4.引用计数允许对一个类的多次引用

struct Dlg{

    var width = 0

    var height = 0

    //var ddd = MyMode()

}

class Mode {

    var dlg = Dlg() //结构体Dlg的实例,

    var interlaced = false

    var frameRate = 0.0

    var name : String?

}


class ViewController: UIViewController {

    

    override func viewDidLoad() {

        super.viewDidLoad()

        //结构体和类都使用构造器语法来生成新的实例。

        var myDLG=Dlg()

        let myMode=Mode()

        //print("width is \(myDLG.ddd.frameRate)") //width is 0.0

        print("width is \(myDLG.width)")//width is 0

        print("width is \(myMode.dlg.width)")//width is 0

        // Objective-C 语言不同的是,Swift 允许直接设置结构体属性的子属性

        myDLG.width = 300

        myMode.dlg = myDLG

        print("the width is \(myMode.dlg.width)")//the width is 300

        //注意:结构体和枚举是值类型

        //!!! 值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝。

        myDLG.width=1000

        print("the width is \(myMode.dlg.width)")//the width is 300(因为是值类型)

        

        

        //结构体类型的成员逐一构造器(Memberwise Initializers for Structure Types)

        //与结构体不同,类实例没有默认的成员逐一构造器。

        let ddd=Dlg(width: 20, height: 40)

        let ddd2=ddd

        //因为 Dlg 是一个结构体,所以ddd2 的值其实是 ddd 的一个拷贝副本,而不是 ddd 本身

        

        //枚举也遵循相同的行为准则:

        enum CompassPoint {

            case North, South, East, West

        }

        var currentDirection = CompassPoint.West

        let rememberedDirection = currentDirection

        currentDirection = .East

        if rememberedDirection == .West {

            print("The remembered direction is still .West")

        }

        // 输出 "The remembered direction is still .West"

        

        

        //注意: 类是引用类型

        //与值类型不同,引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。因此,引用的是已存在的实例本身而不是其拷贝。

        let myClass=Mode()

        myClass.name="你好啊"

        let myClass2=myClass

        print(myClass2.name!) //你好啊

        

        

        //恒等运算符   等价于(===)  不等价于(!==)

        //运用这两个运算符检测两个常量或者变量是否引用同一个实例:

        if myClass === myClass2{

            

            print("两个常量引用同一个实例")

        }//两个常量引用同一个实例

        //注意等价于(===)和等于(==)的不同

        //1.等价于表示两个类型的常量或变量引用同一个类实例

        //2.等于表示两个实例的值相等相同

        

        //类和结构体的选择

        //当符合一条或多条以下条件时,请考虑构建结构体:

          //.该数据结构的主要目的是用来封装少量相关简单数据值

          //.该数据结构的实例在被赋值或传递时,封装的数据将会被拷贝而不是被引用

          //.该数据结构中存储的值类型属性也应该被拷贝,而不是被引用

        

        

        //字符串(String)、数组(Array)、和字典(Dictionary)类型的赋值与复制行为

        //swift 中,许多基本类型,如String Array Dictionary 类型均已结构体的形式实现。这意味着被赋值给新的常量或变量,或被传入函数或方法中时,他们的值会被拷贝

        //OC NSString NSArray NSDictonary类型均以类的形式实现,而并非结构体。他们在被赋值或者被传入函数或方法时,不会发生值拷贝,而是传递现有实例引用

        var aa : Array = ["one" , "two" ,"three"]

        var bb = aa

        bb.append("four")

        print(bb) //["one", "two", "three", "four"]

        print(aa) //["one", "two", "three"]

        

        

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值