[swift]-类的构造函数
博客专区 > XJDomain 的博客 > 博客详情
[swift]-类的构造函数
XJDomain 发表于1年前
[swift]-类的构造函数
  • 发表于 1年前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 自定义构造函数两种经典方式

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
欢迎你们的阅读和赞赏、谢谢!

 

 

标签: 类的构造函数
共有 人打赏支持
粉丝 16
博文 112
码字总数 44060
×
XJDomain
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: