美文网首页程序员
Swift-构造函数,构造函数与KVC

Swift-构造函数,构造函数与KVC

作者: 逾期的誓言 | 来源:发表于2017-09-08 17:04 被阅读160次
timg.jpg 淘劵吧
  • 构造函数类似于OC中的初始化方法:init方法
  • 默认情况下载创建一个类时,必然会调用一个构造函数
  • 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数。
  • 如果是继承自NSObject,可以对父类的构造函数进行重写

创建Person类 继承NSObject

  1. 声明Name 属性
class Person: NSObject {
    // 1,声明name 属性 会报错:(Class 'Person' has no initializers (Person类没有初始化器 默认是init))
    var name: String
}
  1. 调用默认初始化器
class Person: NSObject {
   // 1,声明name 属性 会报错:(Class 'Person' has no initializers (Person类没有初始化器 默认是init))
   var name: String
   
   // 2 ,调用默认的初始化器 会报错:(Property 'self.name' not initialized at implicitly generated super.init call(在调用父类 构造函数之前,self.name 没有被初始化))
   override init() {
       print("-----------------Person init()-----------------")
       super.init()
   }
}
  1. 给name赋值
class Person: NSObject {
    // 1,声明name 属性 会报错:(Class 'Person' has no initializers (Person类没有初始化器 默认是init))
    var name: String
    
    // 2 ,调用默认的初始化器 会报错:(Property 'self.name' not initialized at implicitly generated super.init call(在调用父类 构造函数之前,self.name 没有被初始化))
    override init() {
        //3,Property 'self.name' not initialized at super.init call (提示 self.name 初始化 分配空间,设置初始值)
        // 所以在 super.init() 之前 给name 赋值 
        name = "iOSCodeZhao"
        print("-----------------Person init()-----------------")
        super.init()
    }
}

实例化Person 调用构造函数

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let person = Person();
        print(person.name)
    }
}

重写,重载

重写:父类有这个方法,子类重新实现 需要 override 关键字 如: override func viewDidLoad() {}

重载: 函数名相同 但是参数和个数不同,重载可以给自己的属性从外部设置初始值, OC没有重载,仅有initWith xxx 自定义初始化方法; 如果重载了构造函数,并不没有实现父类 init 方法,系统不再提供init() 构造函数默认是有的

class Person: NSObject {
    var name: String
    
    // 重写
    override init() {
        print("Person init")
        name = "赵师顺"
        super.init()
    }
    //重载
    init(name: String) {
        self.name = name;
        super.init()
    }
}

调用Person的重载

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // 调用系统 构造函数
        let person = Person();
        print(person.name)
        // 重载
        let p = Person(name: "隔壁老王")
        print(p.name)
    }
}

控制台输出结果

屏幕快照 2017-09-08 下午4.10.54.png

构造函数与KVC

注意事项:
1,定义模型属性的时候,如果是对象,通常都是可选的
2, 如果是基本数据类型不能设置成可选的,而且要设置初始值
3,使用KVC 方法之前 应该调用 super.init()
4,如果使用KVC 设置数值,属性不能是private 的

class Person: NSObject {
    // 在OC中很多属性都是在需要的时候创建
    // 因为在手机开发,内存宝贵,有些属性并不一定需要分配空间
    // 延迟加载,在需要的时候在创建
    var name: String?
    // 给基本数据类型做初始化
    var age = 0
    // 如果是Private 私有属性,使用KVC设置值的时候,同样无法设置
    // 如果设置成private  禁止外部访问
    private var title: String?
    
    // 重载构造函数,使用字典为本类设置初始值
    init(dict: [String: AnyObject]) {
        super.init()
        // Use of 'self' in method call 'setValuesForKeys' before super.init initializes self(在使用setValuesForKeys之前 调用 super.init)
        //  KVC 方法是 OC方法,特点就是在运行时给对象发送消息
        // 所以要求 对象已经实例化完成  而且name 是个可选值 所以        super.init() 放在前面
        setValuesForKeys(dict)
    }
}

调用

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let p  = Person(dict: ["name": "肇事顺" as AnyObject])
        print(p.name ?? "")
    }
}

相关文章

  • Swift-构造函数,构造函数与KVC

    构造函数类似于OC中的初始化方法:init方法默认情况下载创建一个类时,必然会调用一个构造函数即便是没有编写任何构...

  • 手把手带你学习Swift3.0(23):构造函数

    1.类的构造函数 2.类的构造函数KVC

  • swift kvc 构造函数

    kvc 是oc特有 ,KVC 本质上是在运行时,直接调用程序会崩溃 介绍 kvc 构造函数 kvc构造函数的作用是...

  • C# 构造函数总结

    构造函数 构造函数分为:实例构造函数,静态构造函数,私有构造函数。 实例构造函数 1、构造函数的名字与类名相同。 ...

  • swift中累的构造函数

    类的构造函数 使用KVC调用构造函数 需要注意事项1.必须继承自NSObject2.必须在构造函数中,先调用sup...

  • Swift基础语法-类的构造函数

    本节知识点 构造函数的介绍 构造函数的基本使用 自定义构造函数 属性与构造函数 1. 构造函数的介绍 构造函数类似...

  • [C++之旅] 10 构造函数

    [C++之旅] 10 构造函数 构造函数的特点 构造函数在对象实例化时被自动调用 构造函数与类同名 构造函数没有返...

  • Flutter 6种构造函数详解

    Flutter有生成构造函数、默认构造函数、命名构造函数、重定向构造函数、常量构造函数、工厂构造函数 一.生成构造...

  • Swift学习笔记(二)

    这篇文章主要的知识点有: ? 和 !的使用 函数的使用 闭包的基本使用 构造函数&析构函数 在构造函数中使用KVC...

  • 原型与原型链

    构造函数与原型 JavaScript 语言使用构造函数(constructor)作为对象的模板。所谓”构造函数”,...

网友评论

    本文标题:Swift-构造函数,构造函数与KVC

    本文链接:https://www.haomeiwen.com/subject/quzgjxtx.html