加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift3.0-KVC构造函数与基本数据类型

发布时间:2020-12-14 06:30:21 所属栏目:百科 来源:网络整理
导读:0.创建一个类:Person.swift //name属性是可选的,在需要的时候创建 //在手机开发中,内存非常宝贵,实际运行中很多属性不一定需要分配空间 var name: String ? 1.重写构造函数,用字典为本类设置初始值 init(dict : [String: AnyObject]) { super .init() //使用

0.创建一个类:Person.swift

//name属性是可选的,在需要的时候创建
//在手机开发中,内存非常宝贵,实际运行中很多属性不一定需要分配空间
var name: String?

1.重写构造函数,用字典为本类设置初始值

init(dict: [String: AnyObject]) {

 super.init() //使用 self 的方法 'setValuesForKeys' 之前,应该调用 super.initt(),否则会奔溃:Use of 'self' in method call 'setValuesForKeys' before super.init initializes self //KVC方法是 OC 的方法,在运行的时候给对象发送消息 //执行'setValuesForKeys',首先要求对象已经实例化完成 setValuesForKeys(dict) }

1.1然在控制器中传值调用

let p = Student(dict: ["name": "小明" as AnyObject])
print(p.name)
//打印输出: Optional("小明")

2.在Person.swift中继续追加一个属性

//给基本类型属性初始化
//如果这样写:
//var age: Int?
//会抛出以下异常:
//Terminating app due to uncaught exception 'NSUnknownKeyException',reason: '[<******> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key age.'
// - 意思是KVC会无法找到age的KEY,因为Int是一个基本数据类型的结构体
//所以要这么写,赋初始值 
var age: Int = 0

2.1去控制器中传值调用

let p = Student(dict: ["name": "小明" as AnyObject,"age": 18 as AnyObject])
print("(p.name) (p.age)")
//打印输出: Optional("小明") 18

3.试图在Person.swift添加一个私有的属性

//private var title: String?
//直接报异常:Terminating app due to uncaught exception 'NSUnknownKeyException',reason: '[<****** > setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key title.
// - 如果是private属性,使用KVC设置的时候,程序会直接崩溃
// - Swift中被Private修饰的属性或方法,彻底禁止外部访问,OC中私有属性或者方法可以通过runtime访问到,所以此时无法使用private修饰
var title: String?

3.1在控制器中打印输出

let p = Student(dict: ["name": "小明" as AnyObject,"age": 18 as AnyObject,"title": "北京" as AnyObject])
print("(p.name) (p.age) (p.title)")
//打印输出: Optional("小明") 18 Optional("北京")

总结:

1. 定义属性的时候,如果是对象,通常都是可选的(类后面加’?’)

- 在需要的时候创建

- 避免写构造函数,可以简化代码

2. 如果是基本数据类型,不能设置为可选的,而且要设置初始值,否则KVC崩溃

3. 若果需要使用KVC设置属性,属性不能是private的

4. 使用KVC方法之前,应该调用 super.init 保证对象实例化完成

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读