DahuangPhoneiOSSwift → Swift中的面向对象的构造器


  共有10079人关注过本帖树形打印复制链接

主题:Swift中的面向对象的构造器

帅哥哟,离线,有人找我吗?
dahuangphone
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:407 积分:4533 威望:0 精华:0 注册:2012/9/29 7:54:10
Swift中的面向对象的构造器  发帖心情 Post By:2014/10/11 21:00:21 [只看该作者]

//构造器,尽在类和结构体存在

//析构函数尽在类中有


class Emplyee{

    var no:Int=0

    var age:Int

    var name:Int?

    

    init(age:Int,no:Int){

        self.age=age

        self.no=no

    }

    

     convenience init(){  //便利构造器,又叫横向构造器,用于同类中的构造器代理

        self.init(age:0,no:0)

    }

    

    deinit//注意写法,没有()

        println("调用析构函数中")

        self.age=0

    }

    

}


class coder:Emplyee{

    var skill:String=""

    //指定构造器必须先初始化自己成员属性,然后再必须调用父类指定构造器

    init(age: Int, no: Int,skill:String) {

        self.skill=skill   //必须在前面

        super.init(age: age, no: no) //这个运行完以后才可以读取实例属性和方法

    }

    //便利构造器必须先调用同类其他构造器,一直到调用指定构造器位置,调用后才可以修改属性

    convenience init(skill:String){

        self.init(age:0,no:0,skill:"");

        self.skill=skill    //必须在后面

    }

}



struct Department{

    var no:Int=0

    var name:String?

    static var countNum:Int?

    var width:Int=0

    var height:Int=0

    

    init(){

        if Department.countNum{

            Department.countNum=Department.countNum!+1

        }else{

            Department.countNum=1

        }

        

        self.init(W:0,H:0) //值类型构造器代理

    }

    

    init(width:Int,height:Int){

        self.width=width

        self.height=height

    }

    

    init(W width:Int,H height:Int){

        self.width=width

        self.height=height

    }

    

    init(length:Int){

        self.init(width:length,height:length)  //值类型构造器代理

    }

    

}


//构造器调用规则


1. 子类指定构造器必须调用其父类的指定构造器

2. 便利构造器必须调用同类中其他构造器

3. 便利构造器必须最终以调用一个指定构造器结束



4. 子类构造器必须保证在所有子类存储属性都初始化完以后才能向上调用父类构造器

5. 子类必须先向上调用父类构造器,然后再为继承的属性设置新值,否则新值会被父类构造器覆盖。

6. 便利构造器必须先调用同类中其他构造器,再为任意属性赋值,否则会被其他构造器覆盖。

7. 构造器在完成第一阶段(走完super.init)之前, 不能调用实例方法,也不能读取实例属性


8. 如果子类没有定义任何指定构造器,那么将继承所有父类的指定构造器

9. 如果子类提供了所有父类指定构造器的实现,那么将自动继承父类的便利构造器


 回到顶部
帅哥哟,离线,有人找我吗?
dahuangphone
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:407 积分:4533 威望:0 精华:0 注册:2012/9/29 7:54:10
  发帖心情 Post By:2014/10/27 17:10:46 [只看该作者]

 失败构造器

class Abc{

    var x:Int?

    var y:Int?

    init?(x:Int,y:Int){

       // self.x=0;self.y=0

        if x < 0 {

            return nil

        }else{

            self.x=x;self.y=y

        }

    }

    

    convenience init?(){

        self.init(x:4,y:8)

    }

    

}


if let abc = Abc() {

    println(abc.x)

}else{

    2555

}


[此贴子已经被作者于2014/10/27 17:11:01编辑过]

 回到顶部