Swift学习笔记十四:构造(Initialization)

类和结构体在实例创建时,必须为所有存储型属性设置合适的初始值。存储型属性的值不能处于一个未知的状态。

你可以在构造器中为存储型属性赋初值,也可以在定义属性时为其设置默认值。以下章节将详细介绍这两种方法。

注意:

当你为存储型属性设置默认值或者在构造器中为其赋值时,它们的值是被直接设置的,不会触发任何属性观测器(property
observers)。

一、基本语法

class Human{
    var name :String
    init(){
        name = "human"
    }
    init(name:String){
        self.name = name;
    }
}
var a = Human(name:"小笨狼")

重点:

① 构造函数使用init关键字

② 一个类或者结构体中构造函数可以有多个,但是他们参数必须不一样(参数名称或者个数不一样)

③ 带参数的构造函数,默认参数名为外部参数名,调用时需要带上参数名,如Human(name:"小笨狼")

④ 类和结构体必须为所有存储属性赋予初始值,初始值可以在定义时,或者构造函数中赋予

⑤ 当为储存属性设置初始值时,不会触发任何观察器

⑥ 若属性类型为可选类型,则初始值默认为nil。这时候可以不手动赋值

⑦ 对于常量属性,也可以在构造函数中赋值,如本例中self.name =
name;

二、默认构造器

Swift 将为所有属性已提供默认值的且自身没有定义任何构造器的结构体或基类,提供一个默认的构造器。

class Human{
    var name :String?
}
var a = Human() //这时候初始化调用的是默认构造器,编译器会自动生成一个构造器,将name=nil

struct Student{
    let name:String?
    let score = 0
}
var b = Student(name:"小笨狼",score:10) //结构体默认构造器是逐一成员构造器

重点:

① 对于类,默认构造器是普通构造器,调用时不需要输入任何参数,构造器会将默认值赋予给属性

② 对于结构体,默认构造器是逐一成员构造器,初始化时需要传入初始值,如:Student(name:"小笨狼",score:10)

三、 便利构造器和指定构造器

指定构造器是类中最主要的构造器。每个类中至少拥有一个指定构造器。便利构造器是类中比较次要的、辅助型的构造器。类中可以没有便利构造器

class Human{
    var name :String?
    init(name:String){      //指定构造器
        self.name = name
    }
    convenience init(){     //便利构造器
        self.init(name:"小笨狼")
    }
}

重点:

① 便利构造器使用convenience 关键字定义,指定构造器不适用任何东西

② 便利构造器必须要调用指定构造器,否则编译器会报错

四、继承与构造

class Student:Human{
    var score:Int
    init(name: String,score:Int){
        self.score = score
        super.init(name:name)
    }
    convenience init() {
        self.init(name:"小笨狼",score:98)
    }
}

重点:

① 指定构造器必须要调用父类构造器

② 指定构造器必须先将本类中新属性赋值,再调用父类构造器

四、通过闭包来设置默认值

如果某个存储型属性的默认值需要特别的定制或准备,你就可以使用闭包或全局函数来为其属性提供定制的默认值。

class student{
    var score:Int[] = {
        var scores:Int[] = Array()
        for m in 0...3{
                scores.append(m)
            }
            return scores
    }()
}

score的默认值是一个数组,为了设置这个数组,需要使用一个for循环,这时候就可以使用闭包,在闭包中设置这个数组。来设置默认值

注意:

① 闭包后需要加(),这是用来告诉 Swift 需要立刻执行此闭包,否则会把闭包本身作为值赋值给了属性

Swift学习笔记十四:构造(Initialization)

时间: 2024-10-12 18:35:17

Swift学习笔记十四:构造(Initialization)的相关文章

Swift学习笔记十四

Deinitialization 当类的实例对象即将要被释放时,会立即调用deinitializer,通过deinit关键字来定义deinitializer,和initializer一样,它也只存在于类类型上. 当实例对象不再有用时,Swift会自动释放该对象.Swift通过自动引用计数(ARC)来管理实例内存.通常情况下,对象被释放时,你并不需要做特别的清理,但是,如果你操作了你自己的资源,可能需要做一些额外的清理工作.比如,你在某个类中打开了一个文件,并往里写入了数据,那么你需要在这个类的实

swift 笔记 (十四) —— 构造过程

构造过程 为了生成类.结构体.枚举等的实例,而做的准备过程,叫做构造过程. 为了这个过程,我们通常会定义一个方法来完成,这个方法叫做构造器.当然它的逆过程,叫做析构器,用于在实例被释放前做一些清理工作以及一此自定义化的处理. 为存储型属性设置初始值 类和结构体在生成实例那一刻,必须为所有的属性赋以特定的初始值. 要么在定义存储型属性的时候直接给个初始值,否则就必须在构造器里面指定一个初始值. 上面说的这两种情况,都不会触发存储型属性的监听者行为(property observer). struc

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];

Swift学习笔记十:属性

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

Swift 学习笔记十五:扩展

扩展就是向一个已有的类.结构体或枚举类型添加新功能(functionality).扩展和 Objective-C 中的分类(categories)类似.(不过与Objective-C不同的是,Swift 的扩展没有名字.) Swift 中的扩展可以: 1.添加计算型属性和计算静态属性 2.定义实例方法和类型方法 3.提供新的构造器 4.定义下标 5.定义和使用新的嵌套类型 6.使一个已有类型符合某个协议 一.扩展属性,构造器,方法 class Human{ var name:String? va

laravel3学习笔记(十四)

原作者博客:ieqi.net ==================================================================================================== 运行时配置 在 Laravel3 中很多地方我们都可以看到“约定大于配置”的影子,我本人也很喜欢这种工程哲学尤其是在框架领域,当然这并不能代替所有的配置.我们知道 Laravel3 中,主要配置都写在 application/config 文件夹下,在应用逻辑中,往往

Swift学习笔记十六:协议

Protocol(协议)用于统一方法和属性的名称,而不实现不论什么功能. 协议可以被类.枚举.结构体实现.满足协议要求的类,枚举,结构体被称为协议的遵循者. 遵循者须要提供协议指定的成员,如属性,方法,操作符,下标等. 一.协议的基本的语法 咱们还是先上代码吧 protocol Human { var name:String{ get set } var isMan:Bool{set get} class var isUsable:Bool { set get } //类成员.表示这个类是否可用

Swift 学习笔记(四)

116.使用可选链式调用代替强制展开 通过在想调用的属性.方法.或下标的可选值(optional value)后面放一个问号(?),可以定义一个可选链.这一点很像在可选值后面放一个叹号(!)来强制展开它的值.它们的主要区别在于当可选值为空时可选链式调用只会调用失败,然而强制展开将会触发运行时错误. 为了反映可选链式调用可以在空值(nil)上调用的事实,不论这个调用的属性.方法及下标返回的值是不是可选值,它的返回结果都是一个可选值.你可以利用这个返回值来判断你的可选链式调用是否调用成功,如果调用有

Swift学习之十四:闭包(Closures)

* 闭包(Closures) * 闭包是自包含的功能代码块,可以在代码中使用或者用来作为参数传值. * 在Swift中的闭包与C.OC中的blocks和其它编程语言(如Python)中的lambdas类似. * 闭包可以捕获和存储上下文中定义的的任何常量和变量的引用.这就是所谓的变量和变量的自封闭, * 因此命名为”闭包“("Closures)").Swift还会处理所有捕获的引用的内存管理. * * 全局函数和嵌套函数其实就是特殊的闭包. * 闭包的形式有: * (1)全局函数都是闭