标签:
1.函数
/*
- 无参数无返回值的函数
- 格式: func 函数名(){代码逻辑}
*/
/*
- 有参数无返回值的函数
- 格式: func 函数名(外部参数1 形参1: 形参类型,...){代码逻辑}
- Swift默认 第一个参数的名省略
- 一般情况下 如果自己使用的函数没有必要定义外部参数
*/
外部参数
/*
- 有参数有返回值的函数
- 格式: func 函数名(外部参数1 形参1: 形参类型,....) -> 返回值类型 {代码逻辑 return 返回值}
*/
与 OC 中的 Block 类似,闭包主要用于异步操作执行完成后的代码回调,网络访问结果以参数的形式传递给调用方
闭包的定义
/*<
- 闭包的定义
- 它和OC中的block相似
- 闭包是一个代码块 在我们需要的时候执行
- 闭包可以作为参数 或者 返回值
- 使用闭包 闭包内使用self 注意循环引用
- 一般情况下 我们均使用let 定义闭包
*/
/*
- 无参数无返回值的闭包
- 格式 let 闭包名 = {代码逻辑}
*/
func AA2(){
let closure = {
print("哈哈")
}
// 执行闭包
closure()
}
/*
- 有参数无返回值的闭包
- 使用in 把代码逻辑和参数隔开
- let 闭包名 = {(形参名: 类型,...) in 代码逻辑} -> 常用方式
- let 闭包名 = {(形参名: 类型,...) -> () in 代码逻辑}
- let 闭包名 = {(形参名: 类型,...) -> Void in 代码逻辑}
*/
func BB2(){
let closure = {(a:Int, b: Int) in
let result = a + b
print(result)
}
closure(5,10)
}
/**
-有参数有返回值的闭包
- 格式: let 闭包名 = {(形参名: 类型,...) -> 返回值类型 in 代码逻辑 return}
*/
func CC2(){
let closure = {(a: Int , b: Int) -> Int in
return a + b
}
// 执行闭包
let result = closure(5,6)
print(result)
}
自定义闭包参数,实现主线程回调
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// // 定义一个闭包
// // 代表 01 和 02
// 写法 01
let closure = {(result: String) -> () in
// 代表 04
print(result)
}
// 执行请求方法
loadData(closure)
// 写法 02
loadData({(result: String) -> () in
// 代表 04
print(result)
})
// 写法 03 常用方式
loadData { (result) -> () in
print(result)
}
}
// 模拟请求数据
func loadData(callback:(result: String) -> ()){
// 开启子线程
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
// 线程睡眠
NSThread.sleepForTimeInterval(2)
// 模拟请求回来数据
let str = "办证137xxxxxxxx"
// 回到主线程
dispatch_async(dispatch_get_main_queue(), { () -> Void in
// 执行闭包
// 代表 03
callback(result: str)
})
}
}
}
构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,为对象成员变量设置初始值,在 OC 中的构造函数是 initWithXXX,在 Swift 中由于支持函数重载,所有的构造函数都是 init
构造函数的作用
/*
- Swift中 构造方法名 均为init
- override 重写
- 如果子类继承父类 做自己特有的事情(给我身上的name 和age 赋值) 需要重写父类以后方法
- Swift 2.0 以后 super.init() 系统默认隐私调用
- 建议大家写上
- 如果你继承了父类 使用父类的init 方法 要重写 然后super.init()
- 如果你身上有必选属性 一定要在init方法中初始化 然后在 super.init()
*/
提示错误 Class ‘Person‘ has no initializers -> ‘Person‘ 类没有实例化器s
原因:如果一个类中定义了必选属性,必须通过构造函数为这些必选属性分配空间并且设置初始值
提示错误 Property ‘self.name‘ not initialized at implicitly generated super.init call -> 属性 ‘self.name‘ 没有在隐式生成的 super.init 调用前被初始化
提示错误 Property ‘self.name‘ not initialized at super.init call -> 属性 ‘self.name‘ 没有在 super.init 调用前被初始化
子类的构造函数
小结
注意事项
调整子类的构造函数
/*
重写构造函数
方法名 相同 参数不同
- 如果程序员定义了重载构造函数 但是没有重写父类的构造函数 那么系统将不再提供该构造函数
- 如果提供了 那么其身上的必选属性父类是不知道为你初始化的
*/
重载构造函数
重载和重写
/**
- KVC 作用
- 字典转模型
- 本质 动态的向对象身上发送setValueForKey 给对象身上的属性赋值
- 给只读属性 赋值
*/
/*
- KVC调用流程
- 01 KVC构造函数
- 02 setValuesForKeysWithDictionary
- setValue(value: AnyObject?, forKey key: String) 给类里面的属性赋值
- 如果其属性已经初始化 那么系统直接赋值 等同于 age
- 如果其属性没有初始化 那么系统帮我们初始化 然后赋值 等同于 name
- 如果字典中对象的key 没有在模型中找到对象的属性
-setValue(value: AnyObject?, forUndefinedKey key: String)
*/
/*
- 便利构造函数
- convenience 便利构造函数的标识
- 可失败的构造器
- 可以返回nil
- 内部使用self 完成初始化
- 不能被重写 或者super
- 便利构造函数完成初始化 必须调用其父类或者自己类的构造函数完成初始化(最终他一定是调用了指定构造函数)
- 指定构造函数
- 如果通过指定构造函数初始化一个对象 一定存在 而且不为nil
- 便利构造函数
- 它可以返回nil
*/
便利构造函数应用场景
标签:
原文地址:http://www.cnblogs.com/MKxiaoyue/p/5744798.html