[swift]-类的构造函数
发布时间:2020-12-14 06:49:35 所属栏目:百科 来源:网络整理
导读:1:两种基本的构造函数 01-自定义构造函数:传入基本参数 01-init(name : String,age : Int) { self.name = name self.age = age} 02-自定义构造函数:传入一个字典 init(dict : [String : AnyObject]) { super.init() // kvc 调用对象的KVC方法字典转模型 //
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("2222211") } // 自定义构造函数:传入基本参数 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) }
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 正则表达式学习笔记011--贪婪和懒惰的匹配
- 两个变量里的数字进行交换,不依赖第三个变量
- FL2440的U-boot-2010.09移植(六)NAND Flash启动支持
- ruby-on-rails – 调试Rails资产管道的最佳实践
- 更改rust工程依赖库的代码放置路径
- c# – DataBind listBox选择项目到文本框
- class path resource [beans.xml] cannot be opened becaus
- vs 2015 编译cocos2dx 报错C1189 #error: Macro definition
- xcode – React Native Error:模糊分辨率
- hihoCoder挑战赛7 1001 正则表达式 (区间DP)