最近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) // 输出结果2
let 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) // 输出结果2
let stringIndex = binarySearch(["2""3""5""7"], forKey: "5"// 输出结果2

从上面的代码我们可以看出,协议可扩展所带来的功能之一就是能够为协议中的方法提供默认实现。

swift面向协议变成我的总结:

面向对象编程和面向协议编程最明显的区别在于程序设计过程中对数据类型的抽取(抽象)上,面向对象编程使用类和继承的手段,数据类型是引用类型;而面向协议编程使用的是遵守协议的手段,数据类型是值类型(Swift中的结构体或枚举)。面向协议编程是在面向对象编程基础上发展而来的,而并不是完全背离面向对象编程的思想。面向对象编程是伟大的编程思想,也是当今主流的编程思想,它的问题在于被过多的使用在其实并不需要使用它的情况下。

Swift是一门支持多编程范式的语言,既支持面向对象编程,也支持面向协议编程,同时还支持函数式编程。在项目开发过程中,控制器和视图部分由于使用系统框架,应更多采用面向对象编程的方式;而模型或业务逻辑等自定义类型部分,则应优先考虑面向协议编程。

面向协议编程是一个比较新的思想,目前只是隐约可以看出它的一些长处,具体的还是需要在使用过程中不断体会.

swift个人总结的更多相关文章

  1. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  2. Swift与C#的基础语法比较

    背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...

  3. iOS开发系列--Swift语言

    概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...

  4. 算法与数据结构(十七) 基数排序(Swift 3.0版)

    前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...

  5. 算法与数据结构(十五) 归并排序(Swift 3.0版)

    上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...

  6. Swift enum(枚举)使用范例

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  7. swift开发新项目总结

    新项目用swift3.0开发,现在基本一个月,来总结一下遇到的问题及解决方案   1,在确定新项目用swift后,第一个考虑的问题是用纯swift呢?还是用swift跟OC混编      考虑到新项目 ...

  8. swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明

    关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...

  9. 【swift】BlockOperation和GCD实用代码块

    //BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...

  10. iOS开发系列--Swift 3.0

    概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...

随机推荐

  1. centos7.2安装及管理docker

    使用的操作系统是是centos7.2,按照官方的推荐的配置,把linux内核升级到3.8以上.安装步骤如下: 1.升级内核版本(包含aufs)cd /etc/yum.repos.dwget http: ...

  2. 松软科技web课堂:JavaScript 注释

    JavaScript 注释用于解释 JavaScript 代码,增强其可读性. JavaScript 注释也可以用于在测试替代代码时阻止执行. 单行注释 单行注释以 // 开头. 任何位于 // 与行 ...

  3. 松软科技带你学开发:SQL--COUNT() 函数

    SQL COUNT() 语法 SQL COUNT(column_name) 语法 COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入): SELECT COUNT(col ...

  4. flutter 打包apk

    打包的具体操作,可以参照官网,只是官网没有那么细 1.修改AndroidManifest.xml 2.构建配置  可以跳过 3.构建签名 4.创建 key.properties 5.配置混淆 6.修改 ...

  5. 深入理解计算机系统cp1:存储单位与编码

    摘要: 理解计算机是如何存储数据的. 原文:深入理解计算机系统cp1:存储单位与编码 作者:Chor Fundebug经授权转载,版权归原作者所有. 1. 存储单位 位:即 bit,表示二进制位,要么 ...

  6. Python 对列表嵌套的数据进行排序

    利用sorted(iterable[, key][, reverse]) key:指定一个接收一个参数的函数,这个函数用于从每个元素中提取一个用于比较的关键字,默认值为None(直接比较元素) rev ...

  7. vue模板语法上

    vue的插值案例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  8. 浅谈JS重绘与回流

    在说浏览器渲染页面之前,我们需要先了解两个点,一个叫 浏览器解析 URL,另一个就是本章节将涉及的 重绘与回流: 重绘(repaint):当元素样式的改变不影响布局时,浏览器将使用重绘对元素进行更新, ...

  9. NOIP2019游记

    道歉:本文章很快打完了,所以有脏话 第零天 早上睡到6点半九点半从学校出发 有种很忙碌的感觉 在车上异常无聊,和zsf用笔记本看了阿丽塔战斗天使,感觉蛮好看的 阿丽塔的形象很丰富 叙事由雾到开 推荐 ...

  10. 2019 SDN上机第5次作业

    2019 SDN上机第5次作业 1.浏览RYU官网学习RYU控制器的安装和RYU开发入门教程,提交你对于教程代码的理解,包括但不限于: 描述官方教程实现了一个什么样的交换机功能? 答:官方教程实现了一 ...