设为首页 加入收藏

TOP

Swift构造函数和便利构造函数(二)
2017-10-10 12:16:16 】 浏览:10080
Tags:Swift 构造 函数 便利
性分配空间
  • 而 OC 中基本数据类型就是保存一个数值,不存在可选的概念
  • 解决办法:给基本数据类型设置初始值
  • 修改后的代码如下:
  • /// 姓名 var name: String? /// 年龄 var age: Int = 0 /// `重写`构造函数 /// /// - parameter dict: 字典 /// /// - returns: Person 对象 init(dict: [String: AnyObject]) { super.init() setValuesForKeysWithDictionary(dict) } 

    提示:在定义类时,基本数据类型属性一定要设置初始值,否则无法正常使用 KVC 设置数值

    KVC 函数调用顺序

    init(dict: [String: AnyObject]) { super.init() setValuesForKeysWithDictionary(dict) } override func setValue(value: AnyObject?, forKey key: String) { print("Key \(key) \(value)") super.setValue(value, forKey: key) } // `NSObject` 默认在发现没有定义的键值时,会抛出 `NSUndefinedKeyException` 异常 override func setValue(value: AnyObject?, forUndefinedKey key: String) { print("UndefinedKey \(key) \(value)") } 
    • setValuesForKeysWithDictionary 会按照字典中的 key 重复调用 setValue:forKey 函数
    • 如果没有实现 forUndefinedKey 函数,程序会直接崩溃
      • NSObject 默认在发现没有定义的键值时,会抛出 NSUndefinedKeyException 异常
    • 如果实现了 forUndefinedKey,会保证 setValuesForKeysWithDictionary 继续遍历后续的 key
    • 如果父类实现了 forUndefinedKey,子类可以不必再实现此函数

    子类的 KVC 函数

    /// 学生类 class Student: Person { /// 学号 var no: String? } 
    • 如果父类中已经实现了父类的相关方法,子类中不用再实现相关方法

    convenience 便利构造函数

    • 默认情况下,所有的构造方法都是指定构造函数 Designated
    • convenience 关键字修饰的构造方法就是便利构造函数
    • 便利构造函数具有以下特点:
      • 可以返回 nil
      • 只有便利构造函数中可以调用 self.init()
      • 便利构造函数不能被重写或者 super
    /// `便利构造函数` /// /// - parameter name: 姓名 /// - parameter age: 年龄 /// /// - returns: Person 对象,如果年龄过小或者过大,返回 nil convenience init?(name: String, age: Int) { if age < 20 || age > 100 { return nil } self.init(dict: ["name": name, "age": age]) } 

    注意:在 Xcode 中,输入 self.init 时没有智能提示

    /// 学生类 class Student: Person { /// 学号 var no: String? convenience init?(name: String, age: Int, no: String) { self.init(name: name, age: age) self.no = no } } 

    便利构造函数应用场景

    • 根据给定参数判断是否创建对象,而不像指定构造函数那样必须要实例化一个对象出来
    • 在实际开发中,可以对已有类的构造函数进行扩展,利用便利构造函数,简化对象的创建

    构造函数小结

    • 指定构造函数必须调用其直接父类的的指定构造函数(除非没有父类)
    • 便利构造函数必须调用同一类中定义的其他指定构造函数或者用 self. 的方式调用父类的便利构造函数
    • 便利构造函数可以返回 nil
    • 便利构造函数不能被重写

    首页 上一页 1 2 下一页 尾页 2/2/2
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇Swift函数和闭包 下一篇Swift的懒加载和只读属性的介绍

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目