标签:
class Person: NSObject var name : String var age : Int // 重写了NSObject(父类)的构造方法 override init() name = "" age = 0 } } // 创建一个Person对象 let p = Person()
class Person: NSObject var name : String var age : Int // 自定义构造函数,会覆盖init()函数 init(name : String, age : Int) self.name = name self.age = age } } // 创建一个Person对象 let p = Person(name: "ryan", age: 18)
注意:
class Person: NSObject var name : String var age : Int // 自定义构造函数,会覆盖init()函数 init(dict : String : NSObject) name = dict"name" as! String age = dict"age" as! Int } } // 创建一个Person对象 let dict = "name" : "ryan", "age" : 18 let p = Person(dict: dict)
注意:
因此属性需要有默认值
class Person: NSObject // 结构体或者类的类型,必须是可选类型.因为不能保证一定会赋值 var name : String? // 基本数据类型不能是可选类型,否则KVC无法转化 var age : Int = 0 // 自定义构造函数,会覆盖init()函数 init(dict : String : NSObject) // 必须先初始化对象 super.init() // 调用对象的KVC方法字典转模型 setValuesForKeysWithDictionary(dict) } } // 创建一个Person对象 let dict = "name" : "ryan", "age" : 18 let p = Person(dict: dict)
闭包和OC中的block非常相似
@interface HttpTool : NSObject - (void)loadRequest:(void (^)())callBackBlock; @end @implementation HttpTool - (void)loadRequest:(void (^)())callBackBlock { dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"加载网络数据:%@", [NSThread currentThread]); dispatch_async(dispatch_get_main_queue(), ^{ callBackBlock(); }); }); } @end
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self.httpTool loadRequest:^{ NSLog(@"主线程中,将数据回调.%@", [NSThread currentThread]); }]; }
block的写法: 类型: 返回值(^block的名称)(block的参数) 值: ^(参数列表) { // 执行的代码 };
class HttpTool: NSObject { func loadRequest(callBack : ()->()){ dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in print("加载数据", [NSThread.currentThread()]) dispatch_async(dispatch_get_main_queue(), { () -> Void in callBack() }) } } }
进行网络请求,请求到数据后利用闭包进行回调
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { // 网络请求 httpTool.loadRequest ({ () -> () in print("回到主线程", NSThread.currentThread()); }) }
类型:(形参列表)->(返回值) 技巧:初学者定义闭包类型,直接写()->().再填充参数和返回值 值: { (形参) -> 返回值类型 in // 执行代码 }
如果闭包没有参数,没有返回值.in和in之前的内容可以省略
httpTool.loadRequest({ print("回到主线程", NSThread.currentThread()); })
尾随闭包写法:
httpTool.loadRequest() { print("回到主线程", NSThread.currentThread()); } // 开发中建议该写法 httpTool.loadRequest { print("回到主线程", NSThread.currentThread()); }
class HttpTool: NSObject { // 定义属性,来强引用传入的闭包 var callBack : (()->())? func loadRequest(callBack : ()->()){ dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in print("加载数据", [NSThread.currentThread()]) dispatch_async(dispatch_get_main_queue(), { () -> Void in callBack() }) } self.callBack = callBack } }
swift中解决循环引用的方式
// weak var weakSelf = self; // [weak self] () -> () in // [unowned self] () -> () in httpTool.loadRequest { [unowned self] () -> () in self.view.backgroundColor = UIColor.redColor() print("回到主线程", NSThread.currentThread()); }
swift中也有懒加载的方式
lazy var 变量: 类型 = { 创建变量代码 }()
懒加载的使用
// 懒加载的本质是,在第一次使用的时候执行闭包,将闭包的返回值赋值给属性 // lazy的作用是只会赋值一次 lazy var array : [String] = { () -> [String] in return ["ryan", "szy", "jack"] }()
标签:
原文地址:http://www.cnblogs.com/itsApe/p/5008827.html