类的构造函数

构造函数的介绍

  • 构造函数类似于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)

swift学习第十三天:类的构造函数的更多相关文章

  1. Swift学习笔记十三

    初始化 初始化是一个在类.结构体或枚举的实例对象创建之前,对它进行预处理的过程,包括给那个对象的每一个存储式属性设定初始值,以及进行一些其他的准备操作. 通过定义初始化器(initializer)来实 ...

  2. 《JS权威指南学习总结--9.2 类和构造函数》

    内容要点: 例9-1展示了在JS中定义类的其中一种方法.但这种方法并不常用,毕竟它没有定义构造函数,构造函数是用来初始化新创建的对象的. 使用关键字new来调用构造函数会自动创建一个新对象,因此构造函 ...

  3. swift学习第十二天:类的属性定义

    类的属性介绍 Swift中类的属性有多种 存储属性:存储实例的常量和变量 计算属性:通过某种方式计算出来的属性 类属性:与整个类自身相关的属性 存储属性 存储属性是最简单的属性,它作为类实例的一部分, ...

  4. Swift学习笔记十三:继承

    一个类能够继承(inherit)还有一个类的方法(methods),属性(property)和其他特性 一.基本的语法 class Human{ var name :String init(){ na ...

  5. python cookbook第三版学习笔记十三:类和对象(三)描述器

    __get__以及__set__:假设T是一个类,t是他的实例,d是它的一个描述器属性.读取属性的时候T.d返回的是d.__get__(None,T),t.d返回的是d.__get__(t,T).说法 ...

  6. python cookbook第三版学习笔记十三:类和对象(四)描述器

    __get__以及__set__:假设T是一个类,t是他的实例,d是它的一个描述器属性.读取属性的时候T.d返回的是d.__get__(None,T),t.d返回的是d.__get__(t,T).说法 ...

  7. swift学习笔记(四)关于类的继承

    在swift中,继承是区分类与其它对象的基本特征 继承后的子类能够重写父类的方法,包含类方法和实例方法,属性和附属脚本(subscript) 在继承过程中,构造器方法init()是不被继承的,须要显示 ...

  8. Swift学习——类的定义,使用,继承,构造等(五)

    Swift学习--类的定义,使用.继承,构造等(五) 类的使用说明 1 使用class和类名来创建一个类名,比如: class student 2 类中属性的声明和常量和变量一样,唯一的差别就是他们的 ...

  9. swift学习第十一天:类的定义

    一: 主要内容 类的介绍和定义 类的属性 类的构造函数 一. 类的介绍和定义 Swift也是一门面向对象开发的语言 面向对象的基础是类,类产生了对象 在Swift中如何定义类呢? class是Swif ...

随机推荐

  1. centos的dns配置总结

    找的一篇好的存根 DNS正反向解析 DNS(Domain Name Service)域名服务.就是域名解析服务器.所谓名称解析的过程就是某个应用程序基于某个搜索键在指定的数据库中查询.而后查询到某些对 ...

  2. C# WPF开源控件库MaterialDesign介绍

    介绍 1.由于前端时间萌发开发一个基础架构得WPF框架得想法, 然后考虑到一些界面层元素统一, 然后就无意间在GitHub上发现一个开源WPF UI, 于是下载下来了感觉不错. 官网地址:http:/ ...

  3. 软考之路--从生活着手,看PV怎样操作

    PV操作.是软考其中一个非常重要的考点,一听到这个名词,顿时赶脚高大上有么有,在软考的历年试题中,也不乏PV操作的身影,老师也对PV操作进行了一次讲课,那时年少.听得稀里糊涂,也不是非常理解,在小编的 ...

  4. NO.1 You must restart adb and Eclipse多种情形分析与解决方式

    一:错误提示 The connection to adb is down, and a severe error has occured. You must restart adb and Eclip ...

  5. thinkphp图片处理

    thinkphp图片处理 一.总结 1.参考手册:参考手册上面啥都有,只是这样业务逻辑不明显,所以看视频会很好,但是如果用编程的灵性(设计),那么其实会更加高效,但是看视频更快而且没那么枯燥,更高效把 ...

  6. Java 批量修改文件后缀

    import java.io.*; public class test { public void reName(String path, String from, String to) { File ...

  7. canvas:飞机大战

    最开始我们要初始化信息,我们有五个状态,游戏封面,加载状态,运行状态,游戏暂停,游戏结束 我们还需要得分score,生命life var START = 1;//初始状态 var LOADING = ...

  8. numpy_basic3

    矩陣 矩阵是numpy.matrix类类型的对象,该类继承自numpy.ndarray,任何针对多维数组的操作,对矩阵同样有效,但是作为子类矩阵又结合其自身的特点,做了必要的扩充,比如:乘法计算.求逆 ...

  9. LoadRunner IP欺骗使用

  10. Redis .Net客户端源码

    1.简单介绍 当前NoSql使用已经极为普遍,无论是Java生态圈,还是.net生态圈.大大小小的Web站点在追求高性能高可靠性方面,不由自主都选择了NoSQL技术作为优先考虑的方面.主流的技术有:H ...