swift学习笔记->初始化

这节重点讲下swift的初始化函数   也就是构造函数init

类,结构,枚举  都有初始化函数,就拿类举例

首先说明一点   在类的初始化时  所有储存属性必须有值   这点在前面类的学习中也有提到过

class test{
  var i:Int
}

所以说这样是会报错的

初始化方法  构造器

class test{
  var i:Int = 1
}//此时该类拥有一个默认的初始化方法   方法中给变量ii赋值
class test1{
  var i:Int
  init (){
    self.i=1
   }
} //此时test1自定义了一个构造器   也就是初始化方法

 特定构造器与便利构造器

特定(专门)的初始化器  designated initliazer

作用:给当前类所有储存属性赋值

注意:

  1.特定构造器可以有多个

  2.特定构造器不能相互调用(建议一个类只写一个特定构造函数)

便利构造(函数)器  convenience init

1.可以实现许多便利的构造方式,类似于java多个构造函数

2.便利构造函数遵循原则:必须调用特定构造函数(直接或间接)

3.swift根据构造函数的形参名字区分构造函数而不是参数个数比如可以定义两个便利构造函数

convenience init(a:Int){

代码块

调用特定构造

}

convenience init(b:Int){

代码块

调用特定构造

}

他们不存在冲突   这是与其他语言不同的   下面看几个例子

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:nn)
    }

}

什么时候用到便利构造呢?

class test{
    var a:Int
    var b:Int
    var c:Int
    init(a:Int,b:Int,c:Int){
        self.a=a
        self.b=b
        self.c=c
    }
    convenience init(a:Int){
        self.init(a:a,b:0,c:0)
    }//初始化时只给a赋值
    convenience init(b:Int){
        self.init(a:0,b:b,c:0)
    }//初始化时只给b赋值
    convenience init(c:Int){
        self.init(a:0,b:0,c:c)
    }//初始化时只给b赋值
    convenience init(a:Int,b:Int){
        self.init(a:a,b:b,c:0)
    }//初始化时赋值a与b
    convenience init(b:Int,c:Int){
        self.init(a:0,b:b,c:c)
    }//初始化时赋值b与c
}

这样他就有许多方便使用的实例化方式了(根据需求去写  不用太多)

构造基本上就是这样    那么如果类被继承呢?

构造函数会不会被继承?

答案是会的(默认情况下会继承父类特定的构造函数)  便利构造函数也能不过要满足条件

1.子类把父类所有特定构造函数都实现(也就是重写)

2.当前类的存储属性必须声明时赋值或重写时先赋值在重写父类特定构造

下面看两个例子

class P{
    var m: Int
    init(m: Int) {
        self.m = m
    }
    init(m: Int,f: Bool) {
        self.m = m
    }
    convenience init() {
        self.init(m: 1)
    }

}
class C: P{
    var n: Int = 1
    override init(m: Int) {
        super.init(m: m)
    }
    override init(m: Int, f: Bool) {
        super.init(m: m, f: f)
    }//重写父类两个特定构造将会继承父类的便利构造

    //    init(n: Int) {
    //        self.n = n
    //        super.init(m: 1)
    //    }
}
var aa = C()         //父类便利构造
var bb = C(m: 2)  //被重写的特定构造
var cc = C(m: 2, f: true)//被重写的特定构造
//var dd = C(n: 2)//子类自身特定构造

当子类的属性声明时没有赋值的情况

子类构造方法必须先给子类属性赋值  在调用父类特定构造方法(不能调用父类便利构造方法)

class P{
    var m: Int
    init(m: Int) {
        self.m = m
    }
    init(m: Int,f: Bool) {
        self.m = m
    }
    convenience init() {
        self.init(m: 1)
    }

}
class C: P{
    var n: Int
    override init(m: Int) {
        self.n = 1
        super.init(m: m)
    }//重写父类特定构造
    override init(m: Int, f: Bool) {
        self.n = 1
        super.init(m: m, f: f)
    }//重写父类特定构造

        init(n: Int) {
            self.n = n
            super.init(m: 1)
        }//自己的特定构造
}
var aa = C()
var bb = C(m: 2)
var cc = C(m: 2, f: true)
var dd = C(n: 2)//继承了父类的特定构造

可失败的初始化

这种情况并不多见  举个例子

class FailureClass {
    var name:String
    init?(name:String) {

        self.name = name
        if name.isEmpty { return nil}

    }
}
//返回的是一个可为nil的类型
let ins = FailureClass(name: "aa")
ins?.name
if let xx = ins {
    xx.name
}
ins!.name

一般来说赋值失败不可能出现   如果失败则实例化返回nil值

加了?问号的初始化构造方法返回的是一个可选对象 访问时也需要解封   这个参考前面 可选的与可选链

时间: 2024-08-05 16:56:07

swift学习笔记->初始化的相关文章

Swift 学习笔记 (初始化)

初始化是为类 结构体 或者枚举准备实例的过程.这个过程需要给实例里的每一个存储属性设置一个初始值并且在新实例可以使用之前执行任何其它所必需的配置或初始化. 初始化器 初始化器在创建特定类型的实例时被调用.在这个简单的形式中,初始化器就像一个没有形式参数的实例方法,使用 init 关键字来写: init() { // perform some initialization here } 代码示例 struct Fahrenheit { var temperature:Double init() {

Swift学习笔记十:属性

1.存储属性       1. 作为特定类或结构实例的一部分,存储属性存储着常量或者变量的值.存储属性可分为变量存储属性(关键字var描述)和常量存储属性(关键字let描述). struct student{ let name = "" var score = 0 } let a = student(name:"小笨狼",score:96)           注意:                ① 定义储存属性时,需要为每一个属性定义一个默认值.在初始化的时候,

Swift学习笔记(4)--字符串及基本使用

String是例如"hello, world","海贼王" 这样的有序的Character(字符)类型的值的集合,通过String类型来表示. Swift 的String类型与 Foundation NSString类进行了无缝桥接.如果您利用 Cocoa 或 Cocoa Touch 中的 Foundation 框架进行工作.所有NSString API 都可以调用您创建的任意String类型的值.除此之外,还可以使用本章介绍的String特性.您也可以在任意要求传

Swift学习笔记

Apple 新推的Swift已经好几天了.对于向我这样的oc都还没完全琢磨透彻的菜鸟来说--(简直就是福利啊,joke) 看了几天的Swift,只是有了基本的印象.总感觉比较换混乱,可能源自与自己没怎么学过脚本语言.索性,边看边记,加深印象. 本来部分内容源自Apple的<The Swift Programming Language>以及互联网教程.其余内容均为个人理解,不保证正确. 进入正题: 1.Swift是什么? Apple唤他作:雨燕.其实英语过了四级的都应该看出来,Swift还有一层

swift学习笔记(七)自动引用计数

与Object-c一样,swift使用自动引用计数来跟踪并管理应用使用的内存.当实例不再被使用时,及retainCount=0时,会自动释放是理所占用的内存空间. 注:引用计数仅适用于类的实例,因为struct和enumeration属于值类型,也就不牵涉引用,所以其存储和管理方式并不是引用计数. 当一个实例被初始化时,系统会自动分配一定的内存空间,用于管理属性和方法.当实例对象不再被使用时,其内存空间被收回. swift中的引用类型分为三种,即Strong强引用,weak弱引用和无主引用unw

Swift学习笔记:类和结构

一.类和结构的异同 类和结构有一些相似的地方,它们都可以: 1. 定义一些可以赋值的属性: 2. 定义具有功能性的方法 3. 定义下标,使用下标语法 4. 定义初始化方法来设置初始状态 5. 在原实现方法上的可扩展性 根据协议提供某一特定类别的基本功能 1. 类还有一些结构不具备的特性: 2. 类的继承性 3. 对类实例实时的类型转换 4. 析构一个类的实例使之释放空间 5. 引用计数,一个类实例可以有多个引用 1. 定义语法 struct Name{ let firstName = "&quo

swift学习笔记(六)析构过程和使用闭包对属性进行默认值赋值

一.通过闭包和函数实现属性的默认值 当某个存储属性的默认值需要定制时,可以通过闭包或全局函数来为其提供定制的默认值. 注:全局函数结构体和枚举使用关键字static标注    函数则使用class关键字标注 当对一个属性使用闭包函数进行赋值时,每当此属性所述的类型被创建实例时,对应的闭包或函数会被调用,而他们的返回值会被作为属性的默认值. ESC: Class SomeCLass{ let someProperty:SomeType={ //给someProperty赋一个默认值 //返回一个与

SWIFT学习笔记04

1.在实际编译时,Swift 编译器会优化字符串的使用,使实际的复制只发生在绝对必要的情况下,这意味着您将字符串作为值类型的同时可以获得极高的性能. 2.for character in "Dog!" { println(character) } // D // o // g // ! 3.通过标明一个Character类型注解并通过字符字面量进行赋值,可以建立一个独立的字符常量或变量: let yenSign: Character = "¥" 4.计算字符数量 l

Swift学习笔记(13)--属性 (Properties)

普通属性用var和let即可,本文不做详述 1.延迟存储属性 延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性.在属性声明前使用@lazy来标示一个延迟存储属性. class DataImporter { /* DataImporter 是一个将外部文件中的数据导入的类. 这个类的初始化会消耗不少时间. */ var fileName = "data.txt" // 这是提供数据导入功能 } class DataManager { @lazy var importer = D