Swift2.0(13)构造方法

  • 构造方法

实例对象在被创建时,需要对存储属性初始化,两种方式:

方法一:在声明属性的同时设定初值(之前一直使用这种方式)

方法二:使用构造方法

构造方法init:在对象创建时自动调用并对实例对象的存储属性进行初始化

a. 无需func关键字声明

b. 参数列表里可以有多个参数,也可以没有参数,参数可以有默认值

c. 支持重写和重载

d. 没有返回值

如:

class Person{
        var name:String
        var age:Int
        init(name:String, age:Int) {
            self.name = name
            self.age = age
        }
        init(name1:String) {
            self.name = name1
            self.age = 11
        }
        init(name2:String) {
            self.name = name2
            self.age = 12
        }
        init() {
            self.name = "123"
            self.age = 20
        }
    }
    var p1:Person = Person()
    print("name:\(p1.name) age:\(p1.age)")//name:123 age:20
    var p2:Person = Person(name1: "iOS")
    print("name:\(p2.name) age:\(p2.age)")//name:iOS age:11
    var p3:Person = Person(name2: "iOS")
    print("name:\(p3.name) age:\(p3.age)")//name:iOS age:12
    var p4:Person = Person(name: "iPhone", age: 7)

print("name:\(p4.name) age:\(p4.age)")//name:iPhone age:7

init()方法是强制包含外部参数名的,即使未显式写出,也是有的,相当于参数名前有#,可以使用 _ 关闭这个强制功能

这里有四个重载的init()方法,其中有两个方法仅仅外部参数名不同,也可以进行重载(普通函数不可以)

构造方法中的常量:

常量属性,在构造方法内部是可以变的,即构造方法执行后才是真正的常量

注意:子类的构造方法不能修改父类常量属性的值

  • 构造方法的分类

默认构造方法:适用于类、结构体、枚举

当所有的存储属性都有默认值时由系统自动生成

如果存储属性是一个可选类型,则不必设置默认值也能具有默认构造方法,其默认值为nil

指定构造方法:显式地写出并且可重载,需要为每个存储属性初始化

便捷构造方法:内部调用其他构造方法

需要在init()前加convenience关键字声明

只有在便捷构造方法中可以显式调用构造方法,如:

convenience init() {

self.init(name:"123", age:20)

}

可失败构造方法:在某些情况下构造对象失败后,返回nil

返回nil,意味着返回值类型是一个可选类型,语法:init?()

可失败构造方法可以声明为便捷构造方法

如:

convenience init?(age:Int) {

self.init(name:"123", age:age)

if ( age < 0 ) {

return nil

}

}

var p1:Person? = Person(age: 5)

隐式解绑的可失败构造方法,即返回值是解绑后的,语法init!()

也就意味着返回值不再是一个可选类型,也就意味着可失败构造方法返回nil程序会崩溃

  • 继承中的构造过程

先来看一段代码:

class Animal {
        var age:Int
        init() {
            self.age = 10
            print("Animal init.")
        }
    }
    class Dog:Animal {
        var name:String
        override init() {
            self.name = "abc"
            print("Dog init.")
        }
    }
    var p = Dog()

print("age:\(p.age) name:\(p.name)")

输出的结果:

Dog init.

Animal init.

age:10 name:abc

重要说明:子类的构造方法一定调用了父类的构造方法完成父类部分的初始化

父子类构造方法的调用顺序:

上面例子中,在子类的init()中并没有显式调用,则父类的init()实在子类init()的最后隐式调用

存在的问题是:在子类的init()中不能访问父类的属性

解决方法:子类的init()中显式调用父类构造方法

override init() {
            self.name = "abc"
            super.init()
            self.age++
            print("Dog init.")

}

需要注意的是:显式调用父类构造方法,必须在子类存储属性初始化后进行

子类也可以添加构造方法,子类构造方法内部也可以指定调用其他构造方法

class Animal {
        var age:Int
        init() {
            self.age = 10
        }
        init(age:Int) {
            self.age = age
        }
    }
    class Dog:Animal {
        var name:String
        override init() {
            self.name = "abc"
            super.init()
            self.age++
        }
        init(age:Int, name:String) {
            self.name = name
            super.init(age: age)
        }
       
    }
    var p = Dog(age: 22, name: "ABC")

print("age:\(p.age) name:\(p.name)")

  • 析构方法

与构造方法相反,对象即将被销毁前,会自动调用析构方法

a. 析构方法 deinit 不带任何参数也没有返回值,不用func修饰

b. 有默认析构方法,也可以显式写出代替

c. 析构方法不能重载

d. 子类实例对象销毁时,先调用子类的析构方法,再调用父类的析构方法

e. 任何位置都不能显式调用deinit

class Animal {
        var age:Int
        init() {
            self.age = 10
        }
        init(age:Int) {
            self.age = age
        }
        deinit {
            print("Animal deinit.")
        }
    }
    class Dog:Animal {
        var name:String
        override init() {
            self.name = "abc"
            super.init()
            self.age++
        }
        init(age:Int, name:String) {
            self.name = name
            super.init(age: age)
        }
        deinit {
            print("Dog deinit")
        }
    }
    var p = Dog(age: 22, name: "ABC")

print("age:\(p.age) name:\(p.name)")

p = Dog()     //基于ARC机制,此时上一个Dog实例对象被销毁

输出结果:

age:22 name:ABC

Dog deinit

Animal deinit.

时间: 2025-01-07 23:53:20

Swift2.0(13)构造方法的相关文章

Swift2.0初见笔记

Swift2.0 1.简单值 1.使用let来声明常量,常量无法改变(相当于const);使用var来声明变量. var myVariable = 42 myVariable = 50 let myConstant = 42 2.常量或者变量的类型必须和你赋给它们的值一样.然而,你不用明确地声明类型,声明的同时赋值的话,编译器会自动推断类型 let implicitInteger = 70 let implicitDouble = 70.0 let explicitDouble: Double

Swift基础知识入门(基于Swift2.0)

//: Playground - noun: a place where people can play import UIKit // Swift中不需要设置main函数入口,编译器会在全局函数中自动设置程序的入口,在书写Swift代码时,可以不使用";"作为语句的结束标志 var str = "Hello, playground" var str1 = "Hello, LiLe" print("Hello World!")

Swift2.0语言教程之函数嵌套调用形式

Swift2.0语言教程之函数嵌套调用形式 Swift2.0语言函数嵌套调用形式 在Swift中,在函数中还可以调用函数,从而形成嵌套调用.嵌套调用的形式往往有两种:一种是在一个函数中调用其他函数:另一种是在一个函数中调用自身函数.以下将对这两种调用进行详细讲解. Swift2.0语言嵌套调用基本形式 嵌套调用是指在函数中可以调用其他函数.调用方式如图7.4所示.   图7.4  函数嵌套的形式 [示例7-25]以下将使用函数的嵌套调用实现对s = 22! + 32!的计算.代码如下: impo

Swift2.0语言教程之类的方法

Swift2.0语言教程之类的方法 Swift2.0语言的方法 方法其实就是函数,只不过它被定义在了类中.在Swift中,根据被使用的方式不同,方法分为了实例方法和类型方法两种.这两种方法的定义也和Objective-C是不同的.本节依次讲解这两种方法. Swift2.0语言的实例方法 实例方法被定义在类中,但是由类的实例调用.所以,这类方法被称为实例方法.实例方法和函数一样,分为了不带参数和带参数两种.以下依次讲解这两种方法的使用. 1.不带参数的实例方法 不带参数的实例方法定义和函数的是一样

Swift2.0语言教程之函数的返回值与函数类型

Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有一个返回值的函数 开发者希望在函数中返回某一数据类型的值,必须要在函数声明定义时为函数设定一个返回的数据类型,并使用return语句进行返回.其中,return语句的一般表示形式如下: return 表达式 其中,表达式可以是符合Swift标准的任意表达式.而具有返回值的函数声明定义形式如下: fu

总结swi1.2适配swift2.0遇到的改变

swift1.2适配swift2.0 以下列举的是我在项目中遇到的需要修改的,基本常见的问题就没有罗列了. 1.find函数变成了为indexOf 2.sort变成了sortInPlace 3.sorted变成了sort 4.enumerate(self.tableView.visibleCells)修改为self.tableView.visibleCells.enumerate() 5.Printable 变成了CustomStringConvertible 6.DebugPrintable

Swift2.0语言教程之Swift2.0语言中的标准函数

Swift2.0语言教程之Swift2.0语言中的标准函数 Swift2.0中的标准函数 函数除了可以根据参数列表的有无分为无参函数和有参函数,还可以从定义角度分为用户自定义函数和标准函数两种.以上的示例都是用户自定函数.Swift提供了74个标准函数,这些函数都可以直接去使用,不需要进行定义.本节将针对常用的标准函数进行详细的讲解. Swift2.0中的绝对值函数abs() abs()函数的功能是求数值的绝对值.其语法形式如下: abs(数值) 函数的返回值是一个零或者正数. [示例7-17]

Swift2.0语言教程之闭包

Swift2.0语言教程之闭包 Swift2.0语言闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift中的闭包与C和Objective-C中的代码块(blocks)以及其他一些编程语言中的Lambda函数比较相似.在本章中所讲的函数其实就是特殊的闭包.本节主要讲解关于闭包的基本使用. Swift2.0语言闭包表达式 闭包表达式是一种利用简洁语法构建内联(内联类似与C语言中的宏定义)闭包的方式.以下这个代码是对两个字符串的比较. import Foundation //判断两个字

关东升的《Swift2.0》(暂定名)即将出版

大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我将在11月左右出版,<Swift2.0>(暂定名) ,<Swift2.0>将在<Swift开发指南>第1版的基础上添加Swift2.0的内容,同时摒弃第1版的一些不合理的内容,使得本书更加适合Swift开发者.我将连续发一些Swift2.0的学习笔记,有兴趣者,可以看一下. 附<Swift2.0>(暂定名)此书目录: 1 本书约定 2 第一个Swift

NVIDIA DIGITS 学习笔记(NVIDIA DIGITS-2.0 + Ubuntu 14.04 + CUDA 7.0 + cuDNN 7.0 + Caffe 0.13.0)

转自:http://blog.csdn.net/enjoyyl/article/details/47397505?from=timeline&isappinstalled=0#10006-weixin-1-52626-6b3bffd01fdde4900130bc5a2751b6d1 NVIDIA DIGITS-2.0 + Ubuntu 14.04 + CUDA 7.0 + cuDNN 7.0 + Caffe 0.13.0环境配置 引言 DIGITS简介 DIGITS特性 资源信息 说明 DIGI