swift对象
来源:互联网 发布:霍尔果斯万游网络 编辑:程序博客网 时间:2024/05/16 17:58
Swift中的对象
构造函数
class Person: NSObject { // 如果类中有必选属性(一定得有值),必须要在初始化方法里面去给其分配空间设置初始值 var name: String var age: Int // 父类 (NSObject)已经存在 init 方法,子类需要执行自己的逻辑,就重写这个方法,使用 `override` // override: 重写 /** 构造函数:分配空间,初始化对象,给对象身上的属性赋值 Swift 中的构造函数没有 func */ override init() { // 必须先初始化子类的必选属性,再初始化父类 name = "老王" age = 18 // 在 Xcode 7 beta 5 之后,可以使用写 super.init() ,但是建议大家写上,调用层次更加明确 super.init() }}
子类的构造函数
class Student: Person { // 学号 ,因为必选属性要在对象一初始化出来就必须保证有值,所以必须在init 方法中设置值 var no: String override init() { // 先初始化子类的`必选属性`,再调用 `super.init` 初始化父类 no = "008" super.init() }
重载构造函数
/** 重载:方法名相同,参数的个数,类型,参数名不同 构造函数 // 如果重载了构造函数,并没有重写默认的构造函数,默认构造函数就不再提供 */ init(name: String, age: Int) { self.name = name self.age = age super.init() }
子类的重载构造函数
// 学号 ,因为必选属性要在对象一初始化出来就必须保证有值,所以必须在init 方法中设置值 var no: String init(name: String, age: Int, no: String) { self.no = no super.init(name: name, age: age) }
KVC构造函数
class Person: NSObject { var name: String? // OC 中基本数据类型 比如 int ,会有一个默认值,为0 // 在 Swift 中,KVC初始化的时候,如果 age 为基本数据类型,并且为可选值的话,kvc 是找不到这个值 var age: Int = 0 // KVC构造函数:是系统在运行时动态向`对象`发送 `setValue:forKey` 这个消息设置值 init(dict: [String: AnyObject]) { // 调用 super.init 才代表对象创建完成 super.init() // 传入字典,其方法内部会遍历字典调用 setValue:forKey这个方法 setValuesForKeysWithDictionary(dict) }// override func setValue(value: AnyObject?, forKey key: String) {// // 这一句代码是父类帮我们设置值// /**// - 找与 key 名字相同的属性// - 如果是基本数据类型可选类型 --> 是找不到这个错// - 如果找到,会判断这个属性是否初始化过// - 如果没有初始化过,系统会初始化这个属性,并设置值// - 有初始化过的,就直接设置值// */// super.setValue(value, forKey: key)// print("key=\(key),value=\(value)")// }// // 在遍历字典调用 setValue:forKey 的方法的,如果没有找到字典里面对应的值,会调用这个,系统默认这个方法,抛出一个异常 override func setValue(value: AnyObject?, forUndefinedKey key: String) { print(key) }
便利构造函数
class Person: NSObject { var name: String? // OC 中基本数据类型 比如 int ,会有一个默认值,为0 // 在 Swift 中,KVC初始化的时候,如果 age 为基本数据类型,并且为可选值的话,kvc 是找不到这个值 var age: Int = 0 /** 便利构造函数 - 可以返回 nil (不一定能够初始化出来对象) - 在自己内部调用当前类的其他指定构造函数初始化 - 只有便利构造函数才能调用自己身上的其他指定构造函数 - 可以根据不同情况判断是否初始化对象 */ // 如果别人在初始化我们这个对象的时候,传入年龄大于150的话,就初始化不成功(返回一个 nil ) convenience init?(name: String, age: Int) { if age > 150 { return nil } // 在这儿初始化 self.init(dict: ["name": name, "age": age]) } // KVC构造函数:是系统在运行时动态向`对象`发送 `setValue:forKey` 这个消息设置值 init(dict: [String: AnyObject]) { // 调用 super.init 才代表对象创建完成 super.init() // 传入字典,其方法内部会遍历字典调用 setValue:forKey这个方法 setValuesForKeysWithDictionary(dict) }// override func setValue(value: AnyObject?, forKey key: String) {// // 这一句代码是父类帮我们设置值// /**// - 找与 key 名字相同的属性// - 如果是基本数据类型可选类型 --> 是找不到这个错// - 如果找到,会判断这个属性是否初始化过// - 如果没有初始化过,系统会初始化这个属性,并设置值// - 有初始化过的,就直接设置值// */// super.setValue(value, forKey: key)// print("key=\(key),value=\(value)")// }// // 在遍历字典调用 setValue:forKey 的方法的,如果没有找到字典里面对应的值,会调用这个,系统默认这个方法,抛出一个异常 override func setValue(value: AnyObject?, forUndefinedKey key: String) { print(key) }}
子类的便利构造函数
class Student: Person { var no: String? // 便利构造函数只能继承不能重写。 convenience init?(name: String, age: Int, no: String) { // 只能使用 self 去调用其他构造函数 self.init(name: name, age: age) self.no = no }}
懒加载
// 懒加载的简单写法 lazy var person1: Person = Person() // 懒加载的完整写法 /** 懒加载的就是执行一个闭包,执行闭包,获取到闭包的返回值,把返回值保存到使用 var 定义的变量 下次再使用的时候,不会执行后面的闭包,直接返回 person2 lazy:标识这个属性是懒加载 */ lazy var person2: Person = { print("我要初始化了") let p = Person() p.name = "老王" p.age = 19 return p }() // 以下代码了解 let pFunc = { () -> Person in print("我要初始化了") let p = Person() p.name = "老王" p.age = 19 return p } lazy var person3: Person = self.pFunc()
getOnly 的属性
// 在 Swift 属性的 get 方法与 set 方法我们基本上不关注 // 了解一下 var _name: String? // 这种属性,也叫存储型属性 var name: String? var age: Int = 0 // 只读属性 // getOnly 属性 --> 在 Swift 中也叫计算型属性 var title: String? { get { // 可以写判断逻辑 return "Mr. \(name)" } } // getOnly 写法 var title2: String { return "Mr. \(name)" }
网络访问
func loadData(){ // 初始化 url // 考虑1:url是否真的能初始化出来 let url = NSURL(string: "http://www.baidu.com/") NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, _, e) -> Void in // 判断 error 是否有值 if e != nil { print(e) return } // 2. 考虑2: data 是否真的有值,没有值应该怎么办 // 位置移枚举在 Swift 是一个数组 // 3. 考虑3:能不能使用 强行try `try!` // try! 告诉系统,我这个网络请求回来的数据一定可以可转成一个字典(后面的代码一定能够执行成功,不会抛错) // try? 可能后面的代码会出现错误,如果出现错误,直接返回 nil // try 可以捕获到代码执行的错误信息 // 判断 data 是否为空 guard let d = data else { print("data为nil") return } do { let result = try NSJSONSerialization.JSONObjectWithData(d, options: []) print(result) }catch{ // 如果上面的代码执行有问题,就会进入到这个地方 // 内部提供一个 error 供我们访问 print(error) } }).resume() }
try try! try?
- try! 告诉系统,我这个网络请求回来的数据一定可以可转成一个字典(后面的代码一定能够执行成功,不会抛错)
- try 默认的.可以捕获到代码执行的错误信息
- try? 可能后面的代码会出现错误,如果出现错误,直接返回 nil
0 0
- swift对象
- OpenStack对象存储-swift
- 对象存储Swift介绍
- swift-对象存储工作总结
- swift 对象和类
- swift面向对象详解
- Swift实现对象归档
- Swift面向对象-枚举
- 获取对象类型(swift)
- Swift:面向对象(属性)
- Swift 对象方法
- Swift 对象类型转换
- swift 面向对象
- Openstack swift对象存储
- swift 对象方法
- swift 对象类型转换
- Swift中的对象
- swift 获取AppDelegate对象
- 减小游戏apk安装包大小
- 电商网站秒杀与抢购的系统架构
- 使用python读写操作同一个excel(xlrd,xlwt,xlutils)
- iOS中常用math函数
- The method getTextContent() is undefined for the type Node方法报错
- swift对象
- PHP学习摘要
- 设计模式之观察者模式
- JS中控制绑定事件执行顺序
- 文章标题
- JSP页面隔行换色
- 在唯一密钥属性“value”设置为“default.aspx”(或者index.asp等)时,无法添加类型为“add”的重复集合项
- 直接选择排序
- excel导入