swift个人总结
最近iOS10 已经开始正式使用,研究使用了swift3.0,将一些总结记录于此,以便以后查阅.持续更新中.
swift中一般将一些功能相近的方法写在同一个延展中,便于代码的规范,找起来也方便.区别oc,swift中的在本文件中,属性可以不用加self.直接写属性名字就能调用.swift3.0中private更加严格,如果方法前加了private,那么只能在方法被定义的方法内部调用.fileprivate是可以在本文件中使用.
面向协议的编程思想.swift语言苹果公司称其为可以面向协议的编程语言.大牛们总结说,swift编程中除非没办法的情况下才用继承,大多数情况下使用协议来解决问题,开始还不是很理解,今天开始有点顿悟了.原来一直用的继承是因为什么,是想继承父类的属性和方法,现在用协议完全可以一样的解决啊,并且结构体和枚举类型也能遵循协议,并且都可以签订多个协议,想要有什么功能就实现什么样的协议就好了.协议中也可以定义属性(这一点和OC不同).
首先我们来对比如下两段示例代码,代码的功能是定义一个更具扩展性的二分查找法。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class Ordered { func precedes(other: Ordered) -> Bool { fatalError("implement me!") }}class Number: Ordered { var value: Double = 0 override func precedes(other: Ordered) -> Bool { return self.value < (other as! Number).value }}func binarySearch(sortedKeys: [Ordered], forKey k: Ordered) -> Int { var lo = 0 var hi = sortedKeys.count while hi > lo { let mid = lo + (hi - lo) / 2 if sortedKeys[mid].precedes(k) { lo = mid + 1 } else { hi = mid } } return lo} |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
protocol Ordered { func precedes(other: Self) -> Bool}struct Number: Ordered { var value: Double = 0 func precedes(other: Number) -> Bool { return self.value < other.value }}func binarySearch(sortedKeys: [T], forKey k: T) -> Int { var lo = 0 var hi = sortedKeys.count while hi > lo { let mid = lo + (hi - lo) / 2 if sortedKeys[mid].precedes(k) { lo = mid + 1 } else { hi = mid } } return lo} |
应该不难看出两者之间的区别以及孰优孰劣,简单解释一下前者的缺点,反过来也就是后者的优点了。
OC语言中没有抽象类这个概念,所有抽象类都是靠文档注释标明,这很蛋疼~
其他类型若想使用该二分查找法,必须继承自Ordered抽象类,在单继承体系中,该类型将无法再继承其他类型
方法参数接收的数组中,类型要求不严格,可以放入多种不同类型的Ordered子类对象
基于前一点原因,为保证严谨性,必须在方法实现内部增加类型判断,这更加蛋疼~~
基于上面的例子,我们可以稍微感受到面向协议编程在扩展性上的优势了,这里再提几个注意点。
Swift 2.0新特性之一,将Self用于约束泛型,功能类似于OC中的instancetype,示例:extension Ordered where Self: Comparable(一个表示可以比较的协议)
Swift 2.0另一个重要的新特性,协议可扩展,意味着你不仅可以扩展一个类型使其遵守Ordered协议,还可以直接扩展协议
那么问题来了,签订了协议就得实现协议,相同的方法在每个类中都去实现代码的重用性岂不是就差了,swift2.0以后苹果推出了协议的扩展,协议的扩展中可以给协议实现默认的实现
// 扩展类型extension Int: Ordered { func precedes(other: Int) -> Bool { return self < other }}extension String: Ordered { func precedes(other: String) -> Bool { return self < other }}let intIndex = binarySearch([2, 3, 5, 7], forKey: 5) // 输出结果2let stringIndex = binarySearch(["2", "3", "5", "7"], forKey: "5") // 输出结果2 |
|
1
2
3
4
5
6
7
8
9
10
|
// 扩展协议extension Comparable { func precedes(other: Self) -> Bool { return self < other }}extension Int: Ordered {}extension String: Ordered {}let intIndex = binarySearch([2, 3, 5, 7], forKey: 5) // 输出结果2let stringIndex = binarySearch(["2", "3", "5", "7"], forKey: "5") // 输出结果2 |
从上面的代码我们可以看出,协议可扩展所带来的功能之一就是能够为协议中的方法提供默认实现。
swift面向协议变成我的总结:
面向对象编程和面向协议编程最明显的区别在于程序设计过程中对数据类型的抽取(抽象)上,面向对象编程使用类和继承的手段,数据类型是引用类型;而面向协议编程使用的是遵守协议的手段,数据类型是值类型(Swift中的结构体或枚举)。面向协议编程是在面向对象编程基础上发展而来的,而并不是完全背离面向对象编程的思想。面向对象编程是伟大的编程思想,也是当今主流的编程思想,它的问题在于被过多的使用在其实并不需要使用它的情况下。
Swift是一门支持多编程范式的语言,既支持面向对象编程,也支持面向协议编程,同时还支持函数式编程。在项目开发过程中,控制器和视图部分由于使用系统框架,应更多采用面向对象编程的方式;而模型或业务逻辑等自定义类型部分,则应优先考虑面向协议编程。
面向协议编程是一个比较新的思想,目前只是隐约可以看出它的一些长处,具体的还是需要在使用过程中不断体会.
swift个人总结的更多相关文章
- iOS代码规范(OC和Swift)
下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- 算法与数据结构(十七) 基数排序(Swift 3.0版)
前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...
- 算法与数据结构(十五) 归并排序(Swift 3.0版)
上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...
- Swift enum(枚举)使用范例
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
- swift开发新项目总结
新项目用swift3.0开发,现在基本一个月,来总结一下遇到的问题及解决方案 1,在确定新项目用swift后,第一个考虑的问题是用纯swift呢?还是用swift跟OC混编 考虑到新项目 ...
- swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明
关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...
- 【swift】BlockOperation和GCD实用代码块
//BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...
- iOS开发系列--Swift 3.0
概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...
随机推荐
- SpringBoot启动项目时提示:Error:(3, 32) java: 程序包org.springframework.boot不存在
场景 在IDEA中新建SpringBoot项目,后启动项目时提示: Error:(3, 32) java: 程序包org.springframework.boot不存在 实现 将pom.xml中par ...
- 一则sql优化实现接口耗时降低30倍的优化案例
业务场景: 也测的业务,如上图,通过捕获业务的涉及的接口如下: 查询接口耗时大于7s,已经是非常的慢 经验提示: 一般接口响应时间慢的问题,最简单的方式就是监控接口相关的sql是否存在问题 开启mys ...
- 用html,CSS 写一个静态的博客网页
<!doctype html> <html> <br/><br/><br/> <head> <meta http-equi ...
- vue slot内容分发
当需要让组件组合使用,混合父组件的内容和子组件的模板的时候,就会用到slot.这个过程就叫内容分发. 最为常用的是两种slot:一种是匿名slot, 一种是具名slot. 匿名 很好理解: 就是默认, ...
- ubuntu 桌面版, ssh 连接时使用,x转发进行使用 gnome-terminal 时出现:Error calling StartServiceByName for org.gnome.Terminal: Timeout was reached 错误
当我按照这种情景使用时,出现了这种情况: 考虑着 gnome 桌面正在运行,可能是gnome-terminal 使用了工厂模式进行创建:查找gnome-terminal 文档,有如下解决方案: gno ...
- android-ramdisk.img分析、recovery.img&boot.img执行过程【转】
一.ramdisk介绍 ramdisk通过直面意思就大概能理解意思,ram disk虚拟内存盘,将ram模拟成硬盘来使用的文件系统.对于传统的磁盘文件系统来说,这样做的好处是可以极大提高文件访问速度: ...
- 微信小程序——wx.navigateTo点击后没反应
首先,检查你跳转的目标路径是不是属于tabBar,若属于,且当前页面存在tabBar时,wx.navigateTo方法是失效的. 此时可用wx.switchTab方法,并记得在app.json中的&q ...
- Python学习一、一个小例子
一.题目: 对于一串氨基酸序列(由字母表前二十个大写字母组成),需要得到每一个氨基酸数目,然后输出到文件夹D:\test\frq.txt,要求用循环和字典实现. 氨基酸序列如下: ABCDEFGHIJ ...
- 使用vmware workstation安装centos 7操作系统
安装步骤 1.点击创建虚拟机,进入新建虚拟机向导,选择自定义,典型:相当于去电脑 旗舰店里店员推荐的是一样,推荐的比一定好,自定义:是手动操作的,没有linux基础最好选择自定义.点击下一步. 2.虚 ...
- DRF--重写views
前戏 在前面几篇文章里,我们写了get请求,post请求,put请求,在来写个delete请求,大概如下. class BookView(APIView): # 查询所有的数据和post方法 def ...