最近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. C# calculate disk size

    static void Main(string[] args) { string dir = @"C:\"; string[] dirs=Directory.GetDirector ...

  2. PlayJava Day019

    今日所学: /* 2019.08.19开始学习,此为补档. */ 1.this: ①this是成员方法的一个特殊的固有的本地变量,它表达了调用这个方法的那个对象. ②在成员方法内部直接调用自己(thi ...

  3. msyql master thread

    ------------------------------------------------------ 2015-02-10----------------------------------- ...

  4. HTTPS混合内容解析

    什么是HTTPS混合内容 我们可能会有这样的经验,当我们通过HTTPS访问一个网站的时候,突然有提示:“本页面包含有不安全的内容”.这个时候会询问是否显示“不安全的内容”,这个时候,就是遇到了有混合内 ...

  5. docker上启动nginx,并配置修改nginx的配置文件

    1.使用docker 下载nginx 镜像  docker pull nginx 2.启动nginx docker run --name nginx -p 80:80 -d nginx 这样就简单的把 ...

  6. python xlwt写入excel操作

    引用https://www.cnblogs.com/python-robot/p/9958352.html 安装 $ pip install xlwt 例子: import xlwt # 创建一个wo ...

  7. Fiddler---Fiddler常用快捷键

    作为一名IT程序猿,在工作的过程中不会一些快捷键,恐怕要被鄙视吧,整理了一些Fiddler的快捷键,操作试试吧 操作快捷键 操作名称 快捷建 ctrl + A   选中所有 ESC   取消选中所有 ...

  8. ffmpeg-python 任意提取视频帧

    ▶ 环境准备 1.安装 FFmpeg 音/视频工具 FFmpeg 简易安装文档 2.安装 ffmpeg-python pip3 install ffmpeg-python 3.[可选]安装 openc ...

  9. JWT的优点和实现Token认证的安全问题

    JWT的优点和实现Token认证的安全问题 一.什么是JWT JWT——Json web token  是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准,可实现无状态.分布式的Web应 ...

  10. php 获取代码执行的时间

    $start_time = microtime(true); // ... 执行代码 ...$end_time = microtime(true);echo '共'.round($start_time ...