swift学习第十三天:类的构造函数
2024-08-31 09:02:43
类的构造函数
构造函数的介绍
- 构造函数类似于OC中的初始化方法:init方法
- 默认情况下载创建一个类时,必然会调用一个构造函数
- 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数。
- 如果是继承自NSObject,可以对父类的构造函数进行重写
构造函数的基本使用
构造函数的基本使用
- 类的属性必须有值
- 如果不是在定义时初始化值,可以在构造函数中赋值
class Person: NSObject {
var name : String
var age : Int
// 重写了NSObject(父类)的构造方法
override init() {
name = ""
age = 0
}
}
// 创建一个Person对象
let p = Person()
初始化时给属性赋值
- 很多时候,我们在创建一个对象时就会给属性赋值
- 可以自定义构造函数
- 注意:如果自定义了构造函数,会覆盖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: "why", age: 18)
字典转模型(初始化时传入字典)
- 真实创建对象时,更多的是将字典转成模型
- 注意:
- 去字典中取出的是NSObject,任意类型.
- 可以通过as!转成需要的类型,再赋值(不可以直接赋值)
class Person: NSObject {
var name : String
var age : Int
// 自定义构造函数,会覆盖init()函数
init(dict : [String : NSObject]) {
name = dict["name"] as! String
age = dict["age"] as! Int
}
}
// 创建一个Person对象
let dict = ["name" : "why", "age" : 18]
let p = Person(dict: dict)
字典转模型(利用KVC转化)
- 利用KVC字典转模型会更加方便
- 注意:
- KVC并不能保证会给所有的属性赋值
- 因此属性需要有默认值
- 基本数据类型默认值设置为0
- 对象或者结构体类型定义为可选类型即可(可选类型没有赋值前为nil)
class Person: NSObject {
// 结构体或者类的类型,必须是可选类型.因为不能保证一定会赋值
var name : String?
// 基本数据类型不能是可选类型,否则KVC无法转化
var age : Int = 0
// 自定义构造函数,会覆盖init()函数
init(dict : [String : NSObject]) {
// 必须先初始化对象
super.init()
// 调用对象的KVC方法字典转模型
setValuesForKeysWithDictionary(dict)
}
}
// 创建一个Person对象
let dict = ["name" : "why", "age" : 18]
let p = Person(dict: dict)
import UIKit class Person: NSObject {
//1:定义类的实例属性,必须保证初始化有默认值,或在初始化中给属性赋值,基本数据类型默认值为0,对象或是结构体默认的值为可选类型,可选类型在没有赋值之前为nil
var name : String?
var age : Int = //2:重写类的init方法,必须加override
override init() {
// 在构造函数中,如果没有明确super.init(),那么系统会帮助调用super.init()
// super.init() print("------")
} //3:自定义构造函数:带参数
init(name : String, age : Int) {
//给类的实例属性复制的时候,可以直接赋值,不用self,当两个名字不同的时候,可以用self来区分不同的值
self.name = name
self.age = age
} //4:字典转模型:AnyObject为任意类型,可为nil,也可以不为nil,dic["name"],取出的类型为AnyObject类型,而属性name为可选类型,是两个完全不相同的类型,所以不能去赋值。要进行类型转化:as? 最终转成的类型是一个可选类型,as! 最终转成的类型是一个确定的类型
init(dic : [String : AnyObject]) {
let tempName = dic["name"]
// tempName是一个AnyObject类型?,转成String?
// as? 最终转成的类型是一个可选类型
// as! 最终转成的类型是一个确定的类型
name = tempName as? String//将AnyObject类型的tempName常量转换为可选类型与name类型相同,所以可以给name去赋值 /*
let tempAge = dict["age"]
let tempAge1 = tempAge as? Int
if tempAge1 != nil {
age = tempAge1!
}
*/ //dic["age"]为AnyObject类型,将此类型转换为与age类型相同才能赋值,先转换为可选类型dic["age"] as? Int,有可能取出的age为nil,就会出现错误,所以进行可选绑定,如果不为nil,强制解包赋值
if let tempAge = dic["age"] as? Int {
age = tempAge
}
} init(dict : [String : AnyObject]) {
super.init()//调用此方法可以初始化一个类实例 setValuesForKeys(dict)//调用类实例的方法,可以直接写,不用self.去调用
} //重写类中的方法必须加上override
override func setValue(_ value: Any?, forUndefinedKey key: String) {
}
} let p = Person()//初始化对象
let p1 = Person(name: "why", age: )
print(p1.age)
print(p1.name)
//as AnyObject:因为规定了字典的value值类型为AnyObject类型,所以在外部传递参数的时候,要将参数转为相同类型as AnyObject就是转换为AnyObject的类型
let p2 = Person(dict: ["name" : "why" as AnyObject, "height" : 1.88 as AnyObject, "age" : as AnyObject])
print(p2.age)
print(p2.name)
最新文章
- Python 3.x 连接数据库(pymysql 方式)
- 。【自学总结 3】------3ds Max 主工具栏
- 使用iMovie和Keynote制作App Preview
- 8.HBase In Action 第一章-HBase简介(1.2.2 捕获增量数据)
- 批量创建客户主数据函数SD_CUSTOMER_MAINTAIN_ALL
- HDU 4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)
- noi2002银河英雄传说(并查集)
- cocos2d疑问
- 年度钜献,108个大数据文档PDF开放下载
- 使用 Struts2 校验器校验用户注册信息
- jQuery第六章
- ajax异步加载遮罩层特效
- 工作中git 操作汇总
- ACM Bee
- Guava Cache 本地缓存组件浅析
- gcc 无法编译c17程序解决办法
- es6拼接字符串``
- C++ #define #if #ifndef 宏指令
- MySQL 去除字段中的换行和回车符
- B - Calculation 2
热门文章
- offSet和client和scroll
- iOS 基于第三方QQ授权登录
- 安卓使用WebView下载文件,安卓实现软件升级功能
- alert警告框
- SUSE Linux Enterprise Server 11 64T 安装(带清晰视频)
- Android学习笔记之Bitmap位图虽触摸点移动
- 1.IntelliJ IDEA搭建SpringBoot的小Demo
- ospp.vbs是什么文件?激活过程cscript ospp.vbs命令详解
- 四种布局JS
- Codeforces Round 363 Div. 1 (A,B,C,D,E,F)