YongSir

专业程序员伪装者

swift-tips003

枚举的使用tip

枚举在swift中被大大加强了,在实际使用中的一最大的感受就是真TM的灵活,基本类型基本都可以做枚举,基本都能被组合,笔者常用的一个例子:

进可当value,退可居enum

1
2
3
4
5
6
7
8
9
10
11
// 进可当value,退可居enum
enum TransStyle: String {
case car = "car"
case bicycle = "bicycle"
}

print(TransStyle.car.dynamicType) // TransStyle
print(String(TransStyle.car).dynamicType)// String

// 想回到过去...
TransStyle(rawVale: "car") // 又变成了enum

swift的协议

可能都听说过swift是面向协议的语言,从其最基本的库中就能看出,得益于开源让我们有机会能一窥一门语言是如何一步一步通过各种各样的协议组合强大起来的

这一部分内容会很多,遇到了就不断的记录在这里:

  • Hashable

此协议给你一个int型的hashValue,可以作为字典的key同时可以被比较
比如游戏中常见的单位的位置address,我们自定义一个类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Address: Hashable {
var point: CGPoint
init(point: CGPoint) {
self.point = point
}

var hashValue: Int {
get {
return "\(self.point.x),\(self.point.y)".hashValue
}
}
}

func ==(lhs: Bit, rhs: Bit) -> Bool {
return lhs.hashValue == rhs.hashValue
}

注意: hashable协议自身实现了Equatable 协议,所以还要实现其唯一的func ==(lhs: Self, rhs: Self) -> Bool方法
这样就能实现Address是否相等的比较了
Address是否相等比较

当然在此基础上,继续实现Camparable协议,还能实现<=, < …等具体的比较

具体参考

Swift Comparison Protocols

协议还能在跳脱一点儿吗?! -- 关联类型

swift 中的协议已经足够跳脱了,毕竟能随意组合,还能通过扩展extension默认带上自带实现的主,到底还能不能好好做协议了,但protocol还真的能在跳脱一些:和泛型集合,不过不叫泛型而是一个专有的名称-- 关联类型,目的是跟泛型一样提供一个占位,在使用时在确认具体类型,如:

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
protocol anyType <Element> {
public mutating func something() -> Self.Element?
}
```
遗憾的是,swift中并不支持在协议中使用这种`参数化类型代指泛型`,而是应该是使用`关联类型`,like this:
```swift
protocol anyType {
associatedType Element // 2.2版本之前用typealias
public mutating func something() -> Self.Element?
}
```

至于为什么,通过这个[proposale](https://github.com/apple/swift-evolution/blob/master/proposals/0011-replace-typealias-associated.md)能猜到一二

毕竟协议跟class, enum, struct中对泛型的要求不同,比如Array<String> ...

参考:http://www.jianshu.com/p/ef4a9b56f951




### swift中的mutable 字典

对于swift中的mutable字典,如果将其转化为`NSDictionary` 和`NSMutableDictionary`那就当我没说
如果使用元组的话,会遇到一个问题,比如:
```swift
var mutableDict = ["key1": value1, "key2": value2]

现在想添加一对数据,有可能会敲出updateValue(value: forKey: )这个方法,但是这个方法只能更新key已存在的值,如果是全新的key的话就会返回nil

所以,简单的办法是使用最直接的方式,like this :

1
mutableDict["key007"] = value007

觉得又点儿怪而已,专门记下来

Custom Presentation controller

我们都知道在iOS7之前,presentation controller是只能按系统提供的最直接的方式Modal,直到iOS7中开放了这部分的API,经过iOS8的进一步改进已经变得很好用了

An anomation controller(UIViewControllerAnimatedTransitioning) is responsible for the animation and the display of the view controller’s content, and the presentation controller(UIViewControllerTransitioningDelegate
) is responsible for the appearance of everything else.