文档章节

[swift]-类的构造函数

XJDomain
 XJDomain
发布于 2016/08/01 15:04
字数 737
阅读 13
收藏 0

1:两种基本的构造函数
 

01-自定义构造函数:传入基本参数

> 01-init(name : String, age : Int) {
     self.name = name 
     self.age = age
}

02-自定义构造函数:传入一个字典

init(dict : [String : AnyObject]) {
        super.init()
        // kvc 调用对象的KVC方法字典转模型
        //self.setValuesForKeysWithDictionary(dict)
        setValuesForKeysWithDictionary(dict)
    }

// 注意:凡是使用kvc了,都要重写:override func setValue(value: AnyObject?, forUndefinedKey key: String) {}  ;因为字典里某些字段不是类的属性就可以不会报错了

override func setValue(value: AnyObject?, forUndefinedKey key: String) {}

 

知识点1:

// as? 最终转成的类型是一个可选类型
// as! 最终转成的类型是一个确定的类型,非可选类型

 

知识点2:

在类里调用对象的方法如kvc方法:self可以省略,//self.setValuesForKeysWithDictionary(dict)  简写成:setValuesForKeysWithDictionary(dict)

 

知识点3:

一般情况下,super.init(),我们不调用,系统会自动调用,系统调用是在该方法最后调用,但是当我们调用系统的kvc方法的时候,我们一定要确保该对象已经创建了,所以我们需要提前手动调用super.init()这个方法,如:

init(dict : [String : AnyObject]) {
        // 提前调用super.init(),确保该对象已经创建了,不然怎么调用对象的一个kvc的方法呢
        // 一般系统会默认调用super.init(),都是在该方法的最后的地方调用,这时候已经晚了,我们需要在调用kvc方法前就需要调用
        super.init()
        // kvc 调用对象的KVC方法字典转模型
        //self.setValuesForKeysWithDictionary(dict)
        setValuesForKeysWithDictionary(dict)
    }

      

2:代码演示:

import UIKit

class Person: NSObject {
    var name : String?
    var age : Int = 0
    
    // 在构造函数中,如果没有明确super.init(),name系统会自动帮我们调用super.init()
    override init() {
       //super.init()
        print("1111111")
    }
    
    
    // 自定义构造函数:传入基本参数
    init(name : String,age : Int) {
        print("22222")
        self.name = name
        self.age = age
    }
    
    
    // 自定义构造函数:传入一个字典
//    init(dict : [String : AnyObject]) {
//        let tempName = dict["name"]
//        //tempName是一个AnyObject?类型,转成String?
//        // as? 最终转成的类型是一个可选类型
//        // as! 最终转成的类型是一个确定的类型,非可选类型
//        name = tempName as? String
//        
//        
////        let tempAge = dict["age"]
////        //age = tempAge as! Int
////        let tempAge1 = tempAge as? Int
////        if  tempAge1 != nil {
////            age = tempAge1!
////        }
////        print(age)
//        
//        if let tempAge = dict["age"] as? Int {
//            age = tempAge
//        }
//    }
    
    
    init(dict : [String : AnyObject]) {
        // 提前调用super.init(),确保该对象已经创建了,不然怎么调用对象的一个kvc的方法呢
        // 一般系统会默认调用super.init(),都是在该方法的最后的地方调用,这时候已经晚了,我们需要在调用kvc方法前就需要调用
        super.init()
        // kvc 调用对象的KVC方法字典转模型
        //self.setValuesForKeysWithDictionary(dict)
        setValuesForKeysWithDictionary(dict)
    }
    
    
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
}


//let p = Person()
//let p1 = Person(name: "sky", age: 19)
//if let name = p1.name {
//    print(name)
//}
//print(p1.age)


let p2 = Person(dict: ["name" : "mike","age" : 18,"height" : 1.88])
print(p2.age)
if let name = p2.name {
    print(name)
}



意见反馈邮件:1415429879@qq.com
欢迎你们的阅读和赞赏、谢谢!

 

 

© 著作权归作者所有

共有 人打赏支持
XJDomain
粉丝 15
博文 112
码字总数 44060
作品 0
嘉定
高级程序员
私信 提问
XZ_Swift之Swift面向对象

Swift面向对象 1、关于命名空间 在 Swift 中,默认同一个项目中,所有的类都是共享的,可以直接访问,不需要 import 所有对象的属性 var,也可以直接访问到 在Swift中,所有类都默认有一个命名空间...

understand_XZ的博客
2017/12/22
0
0
【iOS】Swift类的继承、构造方法、析构器等复习

构造方法内容会多一些,涉及Swift中构造的一些规则与概念。这次写了7个Person来复习,外加名人XiaoMing。 Mark:Playground真是个好东西,特别练习demo写Swift时,实时显示真是大赞! 一、继...

xn4545945
2014/09/23
0
0
Swift3.0 功能一(持续更新)

相关知识点: 修改项目名称两种方式 1.Bundle name 2.Bundle display name try 三种处理异常的方式

袭锐
2016/10/21
0
0
《从零开始学Swift》学习笔记(Day 70)——Swift与Objective-C混合编程之

《从零开始学Swift》学习笔记(Day 70)——Swift与Objective-C混合编程之Swift与Objective-CAPI映射 原创文章,欢迎转载。转载请注明:关东升的博客 Swift与Objective-C API映射 在混合编程...

智捷课堂
2016/02/26
43
0
《从零开始学Swift》学习笔记(Day 70)——Swift与Objective-C混合编程之Swift与Objective-CAPI映射

原创文章,欢迎转载。转载请注明:关东升的博客 Swift与Objective-C API映射 在混合编程过程中Swift与Objective-C调用是双向的,由于不同语言对于相同API的表述是不同的,他们之间是有某种映...

tony关东升
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

小程序异步操作 跨js执行 在微信小程序里面实现跨页面通信

我们知道,在小程序里面一个页面的变化,是通过调用 setData 函数来实现的。所以想做到在二级页面里让一级页面产生变化,最 Quick And Dirty 的做法就是把一级页面的 this 传入到二级页面去,...

xiaogg
10分钟前
0
0
授于管理员登录其它用户

1.沙盒中,授予管理员登录 安全性控制==>登录访问权限政策

在山的那边
12分钟前
1
0
线程安全的CopyOnWriteArrayList介绍

证明CopyOnWriteArrayList是线程安全的 先写一段代码证明CopyOnWriteArrayList确实是线程安全的。 ReadThread.java import java.util.List; public class ReadThread implements Runnable {......

绝地逢生
14分钟前
0
0
Java重写的7个规则

几年前你可能会遇到这样一个面试题:“重写和重载的区别”、而现在随着科技的更迭、面试的问题越来越高级、面试官的问题也越来越深入、此文是上述面试题的一个延伸、让你从简单的重写规则中更...

architect刘源源
14分钟前
1
0
JavaScript异步编程:Generator与Async

从Promise开始,JavaScript就在引入新功能,来帮助更简单的方法来处理异步编程,帮助我们远离回调地狱。 Promise是下边要讲的Generator/yield与async/await的基础,希望你已经提前了解了它。...

前端攻城老湿
15分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部