闭包
类似于 OC 中的 Block,是一段预先定义好的代码,在需要时执行
闭包表达式格式:
{ (形参名称1: 形参类型1, 形参名称2: 形参类型2, ...) -> 返回值 `in`
//要执行的代码
}
in
用于区分闭包定义和代码实现 //定义有参数a的闭包
let coluse = { (a:String)->Void in
print("xxxxx\(a)")
}
//定义无参数的闭包
let coluse1 = {
}
let coluse2 = {()->Void in
let coluse = { (a:String)->Void in
print("xxxxx\(a)")
}
//定义无参数的闭包
let coluse1 = {
}
let coluse2 = {()->Void in
}
// 尾随闭包
// 当闭包是最后一个参数的时候, 将闭包放在参数整个()外面
UIView.animateWithDuration(0, animations: { () -> Void in
print("aa")
// 当闭包是最后一个参数的时候, 将闭包放在参数整个()外面
UIView.animateWithDuration(0, animations: { () -> Void in
print("aa")
})
闭包使用场景(回调)
//1.定义闭包
let cal = {(result:String)->Void in
print("闭包的参数是\(result)")
}
//调用方法
loadDate(cal)
let cal = {(result:String)->Void in
print("闭包的参数是\(result)")
}
//调用方法
loadDate(cal)
}
//2.创建方法,闭包callback:(String)->Void作为方法的参数
func loadDate(callback:(String)->Void) ->Void{
//异步
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
//睡2秒
NSThread.sleepForTimeInterval(2)
//回到主线程
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//设置回调的参数
let callString = "什么鬼"
//3.调用回调
callback(callString)
})
}
}
定义类
- ( )里面是空,表示调用类的默认构造函数 = [[类名 alloc] init];
- 实例化一个类:
var 变量名 = 类名()
class 类名: 父类名 {
//: 一些属性
//: 一些方法
}
注意:
1.Swift的继承和OC一样是通过:, Swift也只有单继承
2.访问类的属性和调用类的方法都是通过.来进行的
3.覆盖父类方法, 需要加关键字 override
类的属性
-
OC
中的属性:
-
-
@property(noatomic, copy) NSString *name;
1.在.h声明 getter 和 setter 方法
2.在.m实现 getter 和 setter 方法
3.在.m生成 _成员变量
-
-
Swift
中属性分为:存储型属性
和计算型属性
-
存储型属性
: 存储数据
-
-
-
属性监视器
: 当存储型属性发生改变的时候,通知我们属性发生了改变,可用于监视值的改变-
willSet
: 在属性将要发生改变时调用 -
didSet
: 在属性已经发生改变时调用(常用)
-
-
计算型属性
: 不存储任何数据,只生成 getter
和 setter
,当只提供 get
方法时,称之为只读计算属性.必须要有 get
方法
-
计算型属性
相当于OC
中的@property
生成的getter
和setter
方法,只不过setter
方法没有给_成员变量
赋值
-
// 存储型属性: 专门负责存储数据的
/*
存储型属性有属性监视器:监视值的改变
1.willSet: 值在改变前调用,了解,一般用不到
2.didSet: 值改变后调用, 这个用的多,如刷新列表数据
*/newValue表示之前的值
var name: String = "liudehua" {
willSet {
print("值改变前: \(newValue)")
}
didSet {
print("值改变后: \(name)")
}
}
// 计算型属性: 提供get和set方法,里面写什么代码根据业务需求来
// 当计算性属性,只提供get方法时,成为只读计算性属性,不能只有set没有get
var nikeName: String {
get {
return "hehe"
}
set {
// newValue就是外面设置的值
print("别人设置了 nikeName 属性,值为 \(newValue)")
}
}
构造函数
作用:在对象实例化过程中给所有的存储型属性设置初始值,并且执行必要的准备和初始化任务.
便利构造函数
- 便利构造函数: 它是辅助性的构造函数.方便创建对象
- 默认情况下,所有的构造函数都是指定构造函数
Designated
-
convenience
关键字修饰的构造方法就是便利构造函数 - 便利构造函数可以返回
nil
- 需要调用本类的一个指定构造函数
构造函数小结
- 1.不需要func关键字.名称是固定的,都叫 init
- 2.如果子类没有实现构造函数.会继承父类的构造函数
- 3.子类构造函数需要调用父类构造函数
- 4.需要先初始化子类属性,在调用父类构造函数
- 5.子类一旦实现了构造函数.就不会继承父类的构造函数
// 构造函数给属性赋值
// 构造函数,先给自己的属性赋值,在调用父类的构造函数
override init() {
self.name = "liudehua"
super.init()
}
// 重载: 函数名称一样,但是参数不一样
init(name: String) {
// 先给自己的属性赋值
self.name = name
super.init()
// 构造函数,先给自己的属性赋值,在调用父类的构造函数
override init() {
self.name = "liudehua"
super.init()
}
// 重载: 函数名称一样,但是参数不一样
init(name: String) {
// 先给自己的属性赋值
self.name = name
super.init()
}
//子类与父类不能有相同名字的属性,但是不是继承关系的两个类可以有相同名字的属性和方法
//便利构造函数
convenience init?(stu_name:String,stu_grade:Float){
if stu_grade < 0 || stu_grade > 100{
print("非人类分数")
return nil
}
//需要调用自身的指定构造函数或便利构造函数,不能调用父类的
self.init(name:stu_name,grade:stu_grade)
}
convenience init?(s_name:String,s_grade:Float){
//调用自身的便利构造函数
self.init(stu_name:s_name,stu_grade:s_grade)
convenience init?(stu_name:String,stu_grade:Float){
if stu_grade < 0 || stu_grade > 100{
print("非人类分数")
return nil
}
//需要调用自身的指定构造函数或便利构造函数,不能调用父类的
self.init(name:stu_name,grade:stu_grade)
}
convenience init?(s_name:String,s_grade:Float){
//调用自身的便利构造函数
self.init(stu_name:s_name,stu_grade:s_grade)
}
懒加载
// 懒加载方式1
lazy var person: Person = Person(name: "小强", age: 20)
lazy var arr: NSArray = NSArray()
// 懒加载方式2(完整写法)
lazy var person2: Person = { () -> Person in
let p = Person(name: "强强", age: 22)
return p
}()
//(默认写法)除了创建对象,还可以做一些初始化操作
lazy var person2: Person = {
let p = Person(name: "强强", age: 22)
// 此处来1000行代码
let p1 = NSArray()
return p
lazy var person: Person = Person(name: "小强", age: 20)
lazy var arr: NSArray = NSArray()
// 懒加载方式2(完整写法)
lazy var person2: Person = { () -> Person in
let p = Person(name: "强强", age: 22)
return p
}()
//(默认写法)除了创建对象,还可以做一些初始化操作
lazy var person2: Person = {
let p = Person(name: "强强", age: 22)
// 此处来1000行代码
let p1 = NSArray()
return p
}()
待续。。。