码迷,mamicode.com
首页 > 编程语言 > 详细

浅谈swift中的那些类,结构以及初始化的操作

时间:2015-11-16 22:28:15      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

首先呢,我们先声明一个类

class Parent {
   //声明一个属性
    var p1: String = "abc"
   
    //声明一个方法
    func m() {
        print("parent m")
    }

    //声明一个静态的方法 
    final func n(){
        
    }
}

然后我们new一个Parent类(注意了,在swift中是没有new的,如果想new 一个的话, 直接调用该类就可以了)

var par = Parent()

调用parent的方法和属性

par.m()
//在控制台显示的是Parent   m 

par.p1

//在控制台显示的是5

好了, 这就是我们常用的class的定义以及方法(属性)的调用

接下来呢, 我们要学习swift中关于父类的继承

 

我们就拿上面的那个Parent当作父类,我们先写一个子类来继承该父类,如果想

重写父类的属性或者方法时,一定要加一个override关键字

class Child: Parent {
    //重写父类的属性或者方法时,一定要加一个override关键字
    
    
    //因为这里定义的父类属性是存储属性,所以如果要重写父类的话, 就要把p1变成一个计算
    //属性
    override var p1: String{
                get {
                    return "dasdf"
                }
                set {
                }
    } 
    override func m() {
        print("child m")
    }

调用子类的属性

var par1: Parent = Child1()
print("dfdfd\(par1.p1)")
//显示的是dfdfddasdf

如果要继承一个父类的话,得先注意以下几点要求

1.重写父类的存储属性后可以给它加观察者(新功能)

2.可以把其改为计算属性 (但是不能减少其功能)

3.父类的只读(只有get,或者let),子类不能添加观察者

 

****************************

类和结构体是人们构建代码所用的一种通用且灵活的构造体。为了在类和结构体中实现各种功能,我们必须要严格按照对于常量,变量以及函数所规定的语法规则来定义属性和添加方法。

与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件。你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口。

注意:通常一个类的实例被称为对象。然而在Swift 中,类和结构体的关系要比在其他语言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上。因此,我们会主要使用实例而不是对象。

接下来呢, 我们就讲一下关于swift中的class和struts有什么共同点和不同点

Swift 中类和结构体有很多共同点。共同处在于:

定义属性用于储存值

定义方法用于提供功能

定义下标用于通过下标语法访问值

定义初始化器用于生成初始化值

通过扩展以增加默认实现的功能

符合协议以对某类提供标准功能

 

与结构体相比,类还有如下的附加功能:

继承允许一个类继承另一个类的特征

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

取消初始化器允许一个类实例释放任何其所被分配的资源

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

 

 

*******************************

初始化:类型(枚举,结构,类)的实例在构建过程中得一系列过程

初始化的主要目的:对内部的存储属性赋值

结构:如果不自己添加初始化,会自动添加默认init和memberwise init

 

 


//
这里定义了一个struct , struct Point3 { var x: Int = 1 var y: Int = 2 //在这里呢,我们有必要说明一个构造函数(init)的几个要点 //1.一般来说,要写一个很全的构造函数,可以初始化所有的成员(特定的初始化器) //2.可以写多个init ,但必须要调用一个很全的构造函数 init(xx: Int) { self.init(xx:xx,yy:1) } init(yy: Int) { // x = 1 // y = yy self.init(xx:1,yy: yy) //self是不能省略的 } //写一个很全的构造函数,可以初始化所有的成员 init(xx: Int ,yy: Int){ x = xx y = yy } }

 

在上面我们有说到struct与class 的不同,class 不会自己添加一个初始化,必须自己添加

 

黄金规则1:实例化之后所有的存储属性必须有值(两种方法赋值)

 

1.专门(特定)的初始化器designated initiliazer赋值,作用是给本类的所有存储属性赋值

2.在变量(常量)后面直接赋值

 

 

 

class的专门初始化器:

1.可以有多个

2.互相不能调用,每一个负责实现所有本类存储属性的初始化

3.负责处理继承过来的存储属性的初始化。

3.1 相信别人,所以表现就是调用父类的特定初始化器(不能

调用父类的便利初始化器)

便利的初始化器:

1.可以有多个

2.可以调用本来其它的便利初始化器,也可以调用本类的特定初始化器

3.最终一定是调用本类的特定初始化器

//作用:1.给本类的所有存储属性赋值
class AA {
    var m:Int
    var n:Int
  //特定的初始化器 init(mm: Int,nn: Int) { m
= mm n = nn } init() { m = 111 n = 22 //这里会报错,表明特定的init之间不能相互调用 //所以建议:实际每个类只写一个特定的初始化器 // self.init(mm:111,nn:222) } //便利的初始化器需要调用专门的初始化器(直接或间接都可以) convenience init(mm: Int){ self.init(mm:mm,nn:1) } convenience init(nn: Int){ //self.init(mm:1,nn:2) self.init(mm:nn) } }

再然后呢,我们再看一段代码, 如何通过子类来实现父类的初始化工作

class Parent  {
    var i:Int = 1
   // var m: String? //只有可为nil的类型会有默认值

    var m: Int
    init(m: Int) {
        self.m = m
    }
}

class Child :Parent {
    var n: Int
    init(n: Int) {
       //阶段一
        self.n = n //先把自己的活干完
        super.init(m: 1)//在叫父类干
        //阶段二
         m = 2//不满意父类的,就自己干

    }

}

好了,这是我对于swift中的class,struts的一些看法,写的不好, 请见谅哦, 谢谢

 

 

 

 

浅谈swift中的那些类,结构以及初始化的操作

标签:

原文地址:http://www.cnblogs.com/zhengyc/p/4970003.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!