一. 将Protocol的方法声明为mutating
Swift的协议不仅可以被class类型实现,也适用于struct和enum, 因为这个原因在写给别人用的协议时需要考虑是否使用mutating来修饰方法,这个关键字修饰方法是为了能在该方法中国修改struct和enum的变量,“所以如果你没在协议方法里写 mutating 的话,别人如果用 struct 或者 enum 来实现这个协议的话,就不能在方法里改变自己的变量了”。
在使用class来实现带有mutating的方法协议,具体实现的方法前面不需要加mutating的修饰。

二. Sequence Swift 的for in 可以用在所有实现了Sequence的类型上,而为了实现Sequence首先需要实现一个IteratorProtocol。

//首先定义一个实现了IteratorProtocol 的class
class ReverseIterator<T>: IteratorProtocol {//IteratorProtocol需要指定一个typealias Elementtypealias Element = Tvar array: [Element]var currentIndex = 0init(array: [Element]) {self.array = arraycurrentIndex = array.count - 1}//提供一个返回Element?的方法 next()func next() -> T? {if currentIndex < 0{return nil} else {let element = array[currentIndex]currentIndex -= 1return element}}
}//其次需要顶一个一个继承Sequence 的class
struct ReverseSequence<T>: Sequence {//和 IteratorProtocol 很类似,不过换成指定一个 typealiastypealias Iterator = ReverseIterator<T>var array: [T]init(array: [T]) {self.array = array}//提供一个返回ReverseIterator的makeIteratorfunc makeIterator() -> ReverseIterator<T> {return ReverseIterator(array: self.array)}
}复制代码

在如下使用:

 var arr = [10, 11, 12, 13, 14]for (i, _) in ReverseSequence.init(array: arr).enumerated() {print("Index\(i) is \(arr[i])")}复制代码

三. 多元组
在swift中,返回值可以包含多个值。

四. @autoclosure ??
在swift中对闭包的用法可以进行一些简写如

logIfTrue({return 2 > 1})  写成   logIfTrue({2 > 1})
复制代码

autoclosure就是把一句表达式自动的封装成一个闭包如下:

func logIfTrue(_ predicate:@autoclosure () -> Bool) {if predicate() {print(true)}}
复制代码

在使用的时候只需要写 logIfTrue(2 > 1),连{}都可以省略。swift会把2 > 1这个表达式自动转换成() -> Bool。

在Swift中,有一个非常有用的操作符 ?? 。可以用来快速地对nil进行条件判断,一个对象在使用??的时候,如Int类型,实际上会被封装成一个 () -> Int

func ??<T>(optional: T?, defaultValue: @autoclosure () -> T) -> T {switch optional {case .Some(let value):return valuecase .None:return defaultValue()}}
复制代码

在这里使用了一个autoclosure 包了一个() -> T,没有autoclosure就不需要在??操作符真正取值之前就需要准备一个默认值传入到这个方法中,实际上我们没有用到这个默认值,而会直接返回optional解包后的值,这样就避免了不必要的开销,方法就是将默认值的计算推迟到optional判定为nil之后。这样就可以很优雅的写法处理对optional及默认值的取值了。
@ autoclosure并不支持带有输入参数的写法。

五. @escaping

 func doWorkAsync(block: @escaping ()->()) {DispatchQueue.main.async {block()}}
复制代码

在闭包前加上@escaping来标明这个闭包是会逃逸出这个方法的。如果在父类或者协议中定义了一个接受@escaping为参数的方法,那么在协议的实现或子类中,也同样需要加上@escaping,否则会被认为是不同的方法。

六. 字面量表达
swift提供了一组非常有意思的协议,使用字面量来表达特定的类型,那些实现了字面量表达协议的类型,在赋值的时候就可以简单地按照协议方法中定义的规则“无缝对应”地通过赋值的方式将值表达为对应类型,实际开发中用到的字面量协议:

ExpressibleByArrayLiteral
ExpressibleByBooleanLiteral
ExpressibleByDictionaryLiteral
ExpressibleByFloatLiteral
ExpressibleByNilLiteral
ExpressibleByNilLiteral
复制代码

所有的字面量都定义了一个typealias和对应的init方法。

七. 初始方法顺序
与Objc不同的是,Swift的初始方法需要保证类型的所有属性都被初始化完成之后才调用父类的初始化方法。最后如果有需要,对父类的需要改变的属性进行重新赋值。 值得注意的是在swift中可以对let 声明的常量进行赋值。

八. default参数
swift的方法是支持默认参数的,即在声明方法的时候可以给参数一个默认的值,NSLocalizedString就是其中这样使用的例子。

func sayHello1(str1: String = "Hello", str2: String, str3: String) {print(str1 + str2 + str3)
}
复制代码

九. AnyClass,元类型和 .self
通过AnyObject.Type这种方法得到的是一个元类型(Meta),A.Type代表的是A类型的类型。

class A {
}let typeA: A.Type = A.self
复制代码

.self可以用在类型后面取得类型本身,例如我们经常会在register cell的class的时候会用到这个元类型。

十.属性观察
属性观察 (Property Observers) 是 Swift 中一个很特殊的特性,利用属性观察我们可以在当前类型内监视对于属性的设定,并作出一些响应。Swift 中为我们提供了两个属性观察的方法,它们分别是 willSet 和 didSet。

var date: NSDate {willSet {let d = dateprint("即将将日期从 \(d) 设定至 \(newValue)")}didSet {print("已经将日期从 \(oldValue) 设定至 \(date)")}
}
复制代码

值得注意的是,计算属性和观察属性是不能共存的。

十一. Optional Map
在swift中可以对Array使用Map的操作,这个方法能对数组中的所有元素应用某一种规则,我们可以在CollectionType(Array遵守了这个协议)的Extension中找到关于这个方法的定义:

extension CollectionType {public func map<T>(@noescape transform: (Self.Generator.Element) -> T) -> [T]
}复制代码

从上面的代码可以看出swift中支持协议的扩展。而同样地Optional也有一个类似的map:

public enum Optional<T> : _Reflectable, NilLiteralConvertible {/// If `self == nil`, returns `nil`.  Otherwise, returns `f(self!)`.public func map<U>(@noescape f: (T) -> U) -> U?}
复制代码

这个方法很方便地对一个optional值做变化和操作,不比进行手动的解包工作。输入会被自动用类似Optinal Binding 的方式进行判断。这些都符合函子(Functor)的概念。

十二. Swift命令行工具
直接使用swift 可以执行.swift的文件,可以通过swift --help,swiftc --help查看,Swift命令行工具的另一个常用的地方就是直接脱离Xcode环境进行编译和生成可执行文件。

swiftc -O test.swift -o test..asm
复制代码

十三. Filter
常见操作是检查一个数组,然后将这个数组中符合一定条件的元素过滤出来并用它们创建一个新的数组

let nums = [2,4,5,6,7,8,9,10]
let filers = nums.filter { $0 % 2 == 0 }
print(filers)
复制代码

swift中Array和Dictionary中的每一个元素可以用$0来简写,通过组合map 和 filter,我们现在可以轻易完成很多数组操作,而不需要引入中间数组。

filter的实现看起来和map很类似:

extension Array {func filter(_ isIncluded: (Element) -> Bool) -> [Element] {var result: [Element] = []for x in self where isIncluded(x) {result.append(x)}return result}
}
复制代码

如果只是想要查找数组中是否有满足条件的元素,从性能上讲就大可不必用filter,而是可以使用contains,一般来讲当我们需要所有结果的时候才去使用filter。

十四. reduce
map和filter都作用在数组上,并产生一个新的、修改过的数组,不过有可能你想要把所有新的元素组合成一个新的值。

let total = nums.reduce(0, +)
复制代码

如下是reduce的实现:

extension Array {func reduce<Result>(_ initialResult: Result,_ nextPartialResult: (Result, Element) -> Result) -> Result{var result = initialResultfor x in self {result = nextPartialResult(result, x)}return result}
}
复制代码

十五. 集合类型协议
1. 序列
Sequence协议是集合类型协议的基础,一个序列代表的是一系列具有相同类型的值,遍历一个序列最简单的方式就是for循环。满足Sequence协议十分简单,就是提供一个返回迭代器的makeIterator() 方法,如最开始的例子。 2.集合类型
集合类型 (Collection) 指的是那些稳定的序列,它们能够被多次遍历且保持一致。Collection协议是简历在Sequence之上,除了从Sequence继承了所有的方法,集合还提供了新的功能如count。

转载于:https://juejin.im/post/5b597c72f265da0f51406839

Swift相关api功能介绍与使用相关推荐

  1. wdm设备驱动程序开发pdf_DWDM是什么 DWDM相关设备功能介绍【图文】

    WDM/DWDM技术,什么是WDM/DWDM技术 波分复用(WDM)是将两种或多种不同波长的光载波信号(携带各种信息)在发送端经复用器(亦称合波器,Multiplexer)汇合在一起,并耦合到光线路的 ...

  2. SWIFT PLM 功能介绍-项目管理的特色

    功能介绍-项目管理的特色 SWIFT PLM-pdm系统软件-工业互联网-企业私有云公有云部署-杰信软件  ꄲ  10月  ꄲ  功能介绍-项目管理的特色 Swift功能介绍-项目管理的特色 Swif ...

  3. Java SE 8新功能介绍:使用Streams API处理集合

    使用Java SE 8 Streams的代码更干净,易读且功能强大..... 在" Java SE 8新功能介绍"系列的这篇文章中,我们将深入解释和探索代码,以了解如何使用流遍历集 ...

  4. 【Aegisub相关】VSCode插件:Aegisub Helper的安装、功能介绍及使用方法

    原作者插件的开源链接: https://github.com/DCTewi/Aegisub-Helper 附上横行写法文件的压缩包: Aegisub Helper 标准模板示例(含使用教程) 题外话: ...

  5. ROS wiki绝对是相关的功能包的介绍最完整的网站。

    ROS wiki绝对是相关的功能包的介绍最完整的网站. https://www.bilibili.com/video/BV1zt411G7Vn?p=6 ROS  wiki里面的功能包是非常多的,基本你 ...

  6. 关于线上API聚合支付系统的功能介绍,为什么选择聚合支付?

    一个完善的聚合支付系统,拥有支付网关.主动对账.退款网关.支付/退款状态查询等功能模块.关于线上API聚合支付系统功能,今天就在这和大家简单地介绍一下,另外它的优势何在,也是现在的商家都选择聚合支付的 ...

  7. Spread表格组件For JAVA功能介绍—表格相关操作

    之前有篇文章我们说到 Spread 表格组件的 Java CTP 版本已经发布:<表格组件JAVACTP版本抢先预览>. 本篇我们来看一下他的主要功能,例如下图所示的Excel我们应当如何 ...

  8. 最新macOS Big Sur11.1新功能介绍

    全新的macOS Big Sur系统现已正式发布.苹果这次发布的最新系统被命名为"Big Sur",而且此次更新被苹果称为macOS有史以来的最大更新.包括迄今为止最重大的 Saf ...

  9. 用Swift搭建API Server,Vapor + PostgreSQL + Docker + ECS + OSS

    目录 一.Vapor代码简介 1. 项目文件结构 2. 文件/文件夹 简介 3. 部分内容详细展开 1> CommonResponse.swift 2> HTTPCode+Message. ...

最新文章

  1. 摩拜单车正式进军日本,积极拓展海外市场
  2. Kafka controller重设计
  3. 2300+ commits,80+ Contributors,阿里 PouchContainer 工程质量实践
  4. 借助JVM生日的时机,说说关于JVM你所不知道的那些事
  5. Java中static的含义和用法
  6. 计算机网络 | 网络层 :IP协议详解
  7. thymeleaf 中文文档
  8. UnrealEngine4 - 关于UObject被自动GC垃圾回收的巨坑
  9. Ubuntu下安装LXR
  10. subtext3php,sublime text3怎么快速查找和替换?快捷键是什么
  11. 惠普110a硒鼓加粉步骤_惠普打印机加粉教程(88a硒鼓/36a硒鼓/78a硒鼓)
  12. perl 脚本学习-----两个文件排序之后输入到一个文件
  13. Spring源码之ApplicationContext(三)加载BeanFactory
  14. 迷你迅雷,IE下载加速补丁(转)
  15. 【求助】如何在移动固态硬盘上装一个完美的移动系统
  16. linux账号延期,Linux用户密码过期延期
  17. RMA退货流程解决方案
  18. 2017年末给自己的一段话
  19. 设计模式之工厂模式,史上最强,不服来辩!
  20. 如何利用python来构造一个信用卡评分模型?

热门文章

  1. mysql的load data,高速将文本文件,插入数据库中
  2. 条件注释判断兼容浏览器版本CSS HACK !--[if !IE]!--[if IE]!--[if lt IE 6]!--[if gte IE 6]...
  3. MFC中使用CTabCtrl或CPropertySheet实现标签页
  4. 页面间参数传递---基于Vue的uniapp手机端_前端UI_uview工作笔记005
  5. 大数据_Spark_核心模块介绍---Spark工作笔记0003
  6. k8s核心技术-Helm(chart模板的使用上)---K8S_Google工作笔记0048
  7. 微服务升级_SpringCloud Alibaba工作笔记0021---Nacos之DataId配置
  8. 软件工作相关考试001---PMP等各种考试
  9. HTML img 标签的 alt 属性
  10. Flyway 数据库版本管理控制