16 Swift 类的构造函数
2017-07-05 本文已影响28人
猴子的救兵520
构造函数的介绍
- 构造函数类似于OC中的初始化方法:init方法
- 默认情况下载创建一个类时,必然会调用一个构造函数
- 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数。
- 如果是继承自NSObject,可以对父类的构造函数进行重写
构造函数的基本使用
基本使用
- 类的属性必须有值
- 如果不是在定义时初始化值,可以在构造函数中赋值
class Person : NSObject {
var name : String
var age : Int
// 重写了NSObject(父类)的构造方法
override init() {
name = "张三"
age = 1
}
}
let p : Person = Person()
print("name = \(p.name) , age = \(p.age)") // name = 张三 , age = 1
初始化时给属性赋值
- 很多时候,我们在创建一个对象时就会给属性赋值
- 可以自定义构造函数
- 注意:如果自定义了构造函数,会覆盖init()方法.即不在有默认的构造函数
class Person : NSObject {
var name : String
var age : Int
// 自定义构造函数,会覆盖init()函数
init(name : String, age : Int) {
self.name = name
self.age = age
}
}
// 创建一个Person对象
let p = Person(name: "李四", age: 18)
print("name = \(p.name) , age = \(p.age)") // name = 李四 , age = 18
字典转模型(初始化时传入字典)
- 真实创建对象时,更多的是将字典转成模型
- 注意:
- 去字典中取出的是NSObject(任意对象类型)或者Any(任意类型).
- 可以通过as!转成需要的类型,再赋值 (不可以直接赋值)
class Person: NSObject {
var name : String
var age : Int
// 自定义构造函数,会覆盖init()函数
init(dict : [String : Any]) {
name = dict["name"] as! String
age = dict["age"] as! Int
}
}
// 创建一个Person对象
let dict : [String : Any] = ["name" : "王五" , "age" : 21]
let p = Person(dict: dict)
print("\(p.name) \(p.age)")
字典转模型(利用KVC转化)
- 利用KVC字典转模型会更加方便
- 注意:
- KVC并不能保证会给所有的属性赋值(字典中可能没有与某一个属性匹配的键值对)
- 因此属性需要有默认值
- 基本数据类型默认值设置为0
- 对象或者结构体类型定义为可选类型即可(可选类型没有赋值前为nil)
class Person: NSObject {
// 结构体或者类的类型,必须是可选类型.因为不能保证一定会赋值
var name : String?
// 基本数据类型不能是可选类型,否则KVC无法转化
var age : Int = 0
// 自定义构造函数,会覆盖init()函数
init(dict : [String : Any]) {
// 必须先初始化对象
super.init()
// 调用对象的KVC方法字典转模型
setValuesForKeys(dict)
}
}
// 创建一个Person对象
let dict : [String : Any] = ["name" : "李白", "age" : 18]
let p = Person(dict: dict)
print("\(p.name) \(p.age)")
- 系列文章
01 Swift最基本的语法变化
02 Swift中的变量和常量
03 Swift中的数据类型
04 Swift逻辑分支
05 Swift中的循环
06 Switf中的字符串
07 Swift 数组
08 Swift字典
09 Swift 元组
10 Swift 可选类型
11 Swift 类型转化
12 Swift 函数
13 Swift 枚举类型
14 Swift 结构体
15 Swift 类的定义
16 Swift 类的构造函数
17 Swift 类的析构函数
18 自动引用计数
19 Swift 可选链
20 协议
21 闭包
22 Swift 懒加载
23 Swift 注释