Xian Rong

Stay hungry Stay foolish


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

响应式编程

发表于 2017-11-13 | 分类于 Swift

不需要考虑调用顺序,只考虑结果,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,万物皆是流。
代表作:KVO运用、RxSwift框架

RxSwift是整个ReactiveX里针对Swift语言的库,ReactiveX里面还有针对Java,JS,.Net, Swift,Android,PHP等使用的库,它们内部都用了ReactiveX的逻辑思想。

ReactiveX是Reactive Extensions的缩写,一般简写为Rx。
Rx(函数库) = Observables(异步数据流) + LINQ(操作符查询异步数据流) + Schedulers(参数化异步数据流的并发处理)。
Rx是一种编程模型,最初由微软开发,结合了观察者模式、迭代器模式和函数式编程的精华,来更方便地处理异步数据流。其中最重要的一个概念是 Observable。
Rx提供了观察者模式来处理事件序列,还提供了很多强大的操作符,操作符让你可以变换、组合、操纵和处理Observable发射的数据;让你可以用声明式的风格组合异步操作序列,它拥有回调的所有效率优势,同时又避免了典型的异步系统中嵌套回调的缺点。

RxSwift 也被描述为函数响应式编程(Functional Reactive Programming, FRP)框架。
Image text
推荐参考学习:
RxSwift
why use rx?
Marbles
使用 RxSwift 进行响应式编程
是时候学习 RxSwift 了
坠入链式编程的幻乐里–用RxSwift仿写知乎日报
RxSwift/Documentation/的中文翻译
ReactiveX文档中文翻译

泛型

发表于 2017-11-13 | 分类于 Swift

使用泛型代码,你可以 写出可重用的函数和数据结构,只要它们满足你所定义的约束,它们就能够适用于各种类型。
比如,像是 Array 和 Set 等多个类型,实际上是它们中的元素类型就是泛型抽象。
我们也可以 创建泛型方法,它们可以对输入或者输出的类型进行泛型处理。
func identity(input: A) -> A 就定义了一个可以作用于任意类型 A 的函数。
某种意义上,我们甚至可以认为带有关联类型的协议是 “泛型协议”。关联类型允许我们对特定的实现进行抽 象。IteratorProtocol 协议就是一个这样的例子:它所生成的 Element 就是一个泛型。

泛型编程的目的是表达算法或者数据结构所要求的核心接口。
使用泛型数据类型来重构代码,能使它们易于测试,更加灵活。

阅读全文 »

链式编程

发表于 2017-11-12 | 分类于 Swift

链式编程:将多个操作通过点号(.)链接在一起成为一句代码,代表作:用OC写的masonry框架
我们平时编码习惯是把事情封装到一个方法中。而链式编程思想则是把要做的事情封装到block,给外界提供一个返回这个Block的方法
链式编程思想方法的特点:
(1)方法的返回值必须是block
(2)block参数:放需要操作的内容
(3)block返回值:方法调用者
链式编程的优点:增加代码可读性,利用block的特点使代码高聚合

阅读全文 »

iOS学习渠道

发表于 2017-11-10 | 分类于 OC

核心途径

1、WWDC开发者大会视频
2、苹果官方文档
查看每个版本更新的内容:General -> Guides -> iOS x.x API Diffs
需要时按需查阅:Sample Code(示例代码) Guides(指南) Reference(API参考)

网站

github
cocoachina
objc中国
优秀博客汇总

CAShapeLayer融合绘图

发表于 2017-11-07 | 分类于 OC

CAShapeLayer属于Core Animation框架下。
CAShapeLayer 是 CALayer 的子类,但是比 CALayer 更灵活,可以画出各种图形。
CAShapeLayer 还有一个神奇的属性 path 用这个属性配合上 UIBezierPath 这个类就可以达到超神的效果。

阅读全文 »

贝塞尔曲线

发表于 2017-11-07 | 分类于 OC

Bézier curve(贝塞尔曲线)是应用于二维图形应用程序的数学曲线。 曲线定义:起始点、终止点(也称锚点)、控制点。通过调整控制点,贝塞尔曲线的形状会发生变化。 1962年,法国数学家Pierre Bézier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名,称为贝塞尔曲线。

阅读全文 »

UICollectionView实现多选且组内单选

发表于 2017-11-07 | 分类于 OC

1、设置UICollectionView可以多选:self.collectionV.allowsMultipleSelection = YES;
2、在数据模型中添加select属性作为记录状态,添加indexPath属性作为拿去对应的Cell
3、取消选中:[collectionView deselectItemAtIndexPath:skut.indexPath animated:YES];
4、选中:[collectionView selectItemAtIndexPath:indexPath animated:YES scrollPosition:UICollectionViewScrollPositionNone];
5、获取所有选中的:NSArray * selectIndexPaths = collectionView.indexPathsForSelectedItems;

阅读全文 »

Swift的协议

发表于 2017-10-17 | 分类于 Swift

我们知道Swift拥有函数、泛型、协议的特性,它们之间的协同工作能让代码的动态特性变得异常强大。
Swift 协议可以被用作代理,也可以让你对接口进行抽象 (比如 IteratorProtocol 和 Sequence)。
Swift 协议与 OC 的协议最大的不同:
(1)可以让结构体和枚举类型满足协议
(2)可以有关联类型
(3)通过协议扩展的方式为协议添加方法实现
协议允许我们进行动态派发,也就是说,在运行时程序会根据消息接收者的类型去选择正确的
方法实现。

阅读全文 »

可选值

发表于 2017-10-11 | 分类于 Swift

在编程世界中有一种非常通用的模式,那就是某个操作是否要返回一个有效值。
在swift开发中,nil也是一个特殊的类型.因为和真实的类型不匹配是不能赋值的(swift是强类型语言)
但是开发中赋值nil,在所难免.因此推出了可选类型
可选类型的取值:有值、空值
可选值的目的:让代码更严谨

阅读全文 »

数组变形

发表于 2017-09-29 | 分类于 Swift
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// 一、Map 转换
let arr1 = [0,1,2,3,5]
let result1 = arr1.map {$0 * $0}
print(result1) // [0, 1, 4, 9, 25]
// 二、FlatMap
let arr2 = [[1,2,3],[4,5,6]];
let res = arr2.map { $0.map{ $0 + 2 } }
print(res) // [[3, 4, 5], [6, 7, 8]]
var flatRes = arr2.flatMap { $0.map{ $0 + 2 } }
print(flatRes) // [3, 4, 5, 6, 7, 8]
// 三、Fliter 过滤
let arr3 = [0,1,2,3,4,5,6,7,8,9,10]
let result3 = arr3.filter {$0 % 2 == 0}
print(result3) //[0, 2, 4, 6, 8, 10]
//map和fliter组合使用,寻找 100 以内同时满足是偶数并且是其他数字的 平方的数
let result31 = (1..<10).map { $0 * $0 }.filter { $0 % 2 == 0 }
print(result31) // [4, 16, 36, 64]
// 四、Reduce 合并
let arr4 = [0,1,2,3,5]
let result4 = arr4.reduce(0,+)
print(result4) //11
// 五、Zip 是将两个序列的元素,一一对应合并成元组,生成一个新序列
let a = [1, 2, 3, 4]
let b = ["a", "b", "c", "d", "e"]
let c = zip(a, b).map { $0 }
print(c) // [(1, "a"), (2, "b"), (3, "c"), (4, "d")]
/*
zip 生成的序列通常会进行下一步处理。比如
func loadColors(colors: [UIColor]) {
zip(self.colorButtons, colors).forEach { (bt, color) in
bt.color = color
}
}
*/
// zip和速记+来通过添加两个冲突的值来解析重复的键
let keyNames2 = ["a", "b", "c", "a", "b"]
let dict = Dictionary(zip(keyNames2, repeatElement(1, count: keyNames2.count)), uniquingKeysWith: +)
print(dict) //["b": 2, "a": 2, "c": 1]
// 六、 ForEach 跟for类型,forEach不返回任何值(有return的时候,使用for比forEach比较好)
//theViews.forEach(view.addSubview)
// 七、其它
/*
$0代表传入的元素本身,而不是下标
$0.0代表传入的元组的第一个值,如果元组被命名过了,则可以直接带名字
$0.age代表传入的模型的age属性
// 年龄升序排列
people.sort { $0.age < $1.age }
// 检查是否有小于18岁的
people.contains { $0.age < 18 }
// 忽略大小写的排序
people.sort { $0.name.uppercased() < $1.name.uppercased() }
*/
12345
XianRong

XianRong

yhtyhrt66@gmail.com

45 日志
6 分类
6 标签
© 2018 XianRong
由 Hexo 强力驱动
主题 - NexT.Pisces