swift 的 guard & defer

guard 使用

守卫,和隐式解析搭配有奇效

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// 原始方法 (强解包可能会出现问题)
func tranIntToString1(x: Int?) -> String {
if x == nil || x! <= 0 {
// 不符合值的要求时,写点代码
return ""
}
// 使用x
return x!.description
}
// 改进
func tranIntToString2(x: Int?) -> String {
if let x = x where x>0 {
return x.description
}
return ""
}
// 保镖模式
// 和上面写法对比
func tranIntToString3(x: Int?) -> String {
guard let x = x where x > 0 else {
return ""
}
// 变量不符合条件判断时,执行下面代码
return x.description
}
// 非可选型
func tranIntToString4(x: Int) -> String {
guard x > 0 else {
return ""
}
return x.description
}
// 常常用于条件判断拦截
var view = UIView(frame: CGRectMake(0,0,80,80))
view.backgroundColor = UIColor.redColor()
UIView.animateWithDuration(0.3) { [weak view]() -> Void in
guard let view = view where view.alpha>0 else {return}
view.alpha = 0
}

懒加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//1.分析 NSArray 是一个闭包的返回值,而这是一个没有参数的闭包
lazy var dataArray:NSArray = { [] }()
//2.也可以写成这样
lazy var dataArray:NSArray = { return NSArray() }()
//3.从plist文件加载
lazy var dataArray:Array<XWWine> = {
let winePath = NSBundle.mainBundle().pathForResource("wine.plist", ofType: nil)!
let winesM = NSMutableArray(contentsOfFile: winePath);
var tmpArray:Array<XWWine>! = []
for tmpWineDict in winesM! {
var wine:XWWine = XWWine.wineWithDict(tmpWineDict as! NSDictionary)
tmpArray.append(wine)
}
//lazy闭包里就运行一次
return tmpArray
}()

调用的时候再在家初始化方法(懒加载)

1
2
3
4
lazy private var underlineView: UIView = {
let view = UIView(frame: .zero)
return view
}()

defer 关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
defer 关键字
*/
postfix func ++(inout x: Int) -> Int {
defer {
x = x/2
defer {
x += 100
}
}
return x
}
//
//postfix func ++(inout x: Int) -> Int {
// let current = x
// x += 2
// return current
//}
var num = 100
let num2 = num++
num //150
num2 //100
prefix func ++(inout x:Int) -> Int {
x += 2
return x
}
var number = 100
let number2 = ++number
number // 102
number2 // 102

嵌套枚举使用(简直就是动态Model)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public enum MenuScrollingMode {
case ScrollEnabled
case ScrollEnabledAndBouces
case PagingEnabled
}
public enum MenuItemWidthMode {
case Flexible
case Fixed(width: CGFloat)
}
public enum MenuDisplayMode {
case Standard(widthMode: MenuItemWidthMode, centerItem: Bool, scrollingMode: MenuScrollingMode)
case SegmentedControl
case Infinite(widthMode: MenuItemWidthMode)
}
// 初始化:用来携带信息很不错
public var menuDisplayMode = MenuDisplayMode.Standard(widthMode: PagingMenuOptions.MenuItemWidthMode.Fixed(width: 44), centerItem: false, scrollingMode: PagingMenuOptions.MenuScrollingMode.PagingEnabled)
// 实例
func labelWidth(size size: CGSize, widthMode: PagingMenuOptions.MenuItemWidthMode) -> CGFloat {
switch widthMode {
case .Flexible: return ceil(size.width)
case let .Fixed(width): return width
}
}