目录
stride ,self
, typealias , zip
1>巧用 stride 循环
stride 是 Strideable 协议中定义的一个方法, 它可以按照指定的递进值生成一个序列。可以用在 Swift 的循环语法结构中。定义如下:
public func stride(to end:Self, by stride:Self.Stride) ->StrideTo
public func stride(through end:Self, by stride:Self.Stride) ->StrideThrough
这两个方法的区别很简单:(是否包含终点值)
for i in 0.stride(to:5, by:1) {
print(i)//0,1,2,3,4
}
for i in 0.stride(through:5, by:1) {
print(i)//0,1,2,3,4,5
}
那在循环中可以怎么用呢:
//(by:可以传入循环的步长)
for i in 0.stride(through: 10, by: 3) {
print(i) //0,3,6,9
}
这个写法类似于 python 中的 for 循环写法
for i in range(0,10,3):##(起始值,终止值, 步长)
print(i) ##0,3,6,9
2>神奇的self
问题来源
这两天微博上也有讨论详见
如果你的变量如果和 Swift 的关键字冲突的话,你可以使用' '包裹住变量名,这样就可以用了
self.saveButton.action { [weak self] _ in
guard let `self` = self else { return }
//do something
}
3>typealias的一点小用法
之前写过一篇来介绍 typealias的用法点击查看
现在在项目中有一点小更新,让typealias更加好用,用 private 来定义 typealias, 实现代理方法的分离,让项目结构更加清晰
private typealias Delegate = ViewController
extension Delegate: UITableViewDelegate {
//delegate method
}
private typealias DataSource = ViewController
extension DataSource: UITableViewDataSource {
//dataSource method
}
4>zip函数的一点小小用法
首先看看 zip 函数是怎么定义的
public func zip(sequence1: Sequence1, _ sequence2: Sequence2) -> Zip2Sequence
可以看到zip()函数接收两个序列,并且返回一个Zip2Sequence类型的数据
但什么是 zip2Sequence呢?还是来个小例子来说明吧
let a = [1,2,3]
let b = ["one", "two", "three"]
let c = zip(a, b)
那么 c的值什么呢?
**▿ Swift.Zip2Sequence, Swift.Array>**
** ▿ _sequence1: 3 elements**
** - [0]: 1**
** - [1]: 2**
** - [2]: 3**
** ▿ _sequence2: 3 elements**
** - [0]: one**
** - [1]: two**
** - [2]: three**
这样我们就可以拼一个 dictionary
var dic: [String: Int] = [:]
for (i, j) in ccc {
dic[j] = i
}
**["one": 1, "three": 3, "two": 2]**
现在跳出 swift, 来看看 python 中的 zip 函数
x=['one','two','three']
y=[80,90,95]
d=dict(zip(x,y))
**[('bob', 80), ('tom', 90), ('kitty', 95)]
python 中的 zip 比 swift 简便不少