转自:swiftcafe

Swift 3.0 更新越来越临近,这次更新会给我们带来很多实用的内容,比如对 Objc 库的迁移,会更符合 Swift 的语法风格。用过之前版本的 Swift,我们会发现很多 Objc 库的方法名称其实还是以 Objc 的风格来命名,而这次 Swift 3.0 的更新会专门处理这个问题。

原因

这个源于一个编号为 SE-0005 的提案,并且已经审核通过。这个方案的提出,源于这样一个痛点。 Swift 应用于 iOS App 开发,就免不了会依赖于原生的 Cocoa Touch 库。而由于历史原因,大家也都知道, iOS 原生库大多时基于 Objc 来实现的。所以他们的编码规范也都遵循着 Objc 的规范,诸如函数,方法的命名规则这些,都有自己的一套标准。

而 Swift 3.0 也发布了自己的 API 设计规范,同时 Objc 也有自己的设计规范,这样一来我们使用 Swift 开发 iOS App 的时候,其实总是在游走于两套规范的 API 之间,对开发者的体验嘛,就不是很好了。

例子

咱们用一个实际的例子来说明这个问题。 比如 NSString 有这样一个方法:

1
2
let content = listItemView.text.stringByTrimmingCharactersInSet(
   NSCharacterSet.whitespaceAndNewlineCharacterSet())

stringByTrimmingCharactersInSet 会剪掉字符串头尾中的某些字符。从这个方法名中,明显的可以看出它是以 Objc 规范来命名的。

如果以 Swift 的编码规范,这个方法其实应该这样命名:

1
let content = listItemView.text.trimming(.whitespaceAndNewlines)

从这里可以看出,objc 的命名方式,很多会把函数的返回值类型,以及参数类型都包含在函数名里面。比如我们上面的 stringByTrimmingCharactersInSet 方法。但这和 Swift 命名规则就不同了。而且随着 Swift 规范的清晰,这个问题就越来越凸显出来了。

所以 Swift 3.0 才会将这个问题提上日程,并在这个版本中准备解决这个问题。

规则

解决这个问题,肯定不能手动的替换。因为系统库的方法实在太多了,所以就需要总结出一系列替换规则。根据这些规则将相应的标识替换完成。

那么 Swift 具体是怎么做的呢, 咱们来了解一下。

扩大 swift_name 编译属性的应用范围 - 这个涉及到 Swift 底层的概念,当我们将 Objc 的 API 导入到 Swift 的时候,我们是可以指定一个编译属性 swift_name 的。而这个编译属性,可以将 Objc 中的标识名称在 Swift 中以不同的名字表现出来。但在之前的版本中,这个编译属性只能对枚举项和工厂方法有效,这次将会扩大它的范围。

去除多余的类型名称 - Objc 的编码规范中,会建议在方法名称中将参数名和类型也表示出来,而这个在 Swift 中就是多余的,我们前面那个例子也演示了。这个也是着重处理的点。

添加默认参数 - 对于 Objc 需要默认参数的地方,会在 Swift 中添加上默认参数,比如一些选项参数:

1
NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments)

这个 option 参数就会提供默认参数。

添加第一个参数的参数标签 - 为方法的第一个参数添加合适的参数标签。

在布尔属性前面加上 is - 在最新的 Swift 规范中,需要在布尔属性前面加上 is, 而 Objc 规范恰巧不建议使用 is,所以在 Swift 3 中会将 Objc 迁移过来的布尔属性,按照 Swift 规范来进行修改。可以参考 Swift 规范中关于布尔属性的部分内容。

值类型变成小写 - 会将 Objc 的属性值以小写开头, 比如 URLHandler 会变为 urlHandler。

下面是一个官方文档中给出的转换的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class UIBezierPath : NSObject, NSCopying, NSCoding {
  convenience init(ovalInRect: CGRect)
  func moveToPoint(_: CGPoint)
  func addLineToPoint(_: CGPoint)
  func addCurveToPoint(_: CGPoint, controlPoint1: CGPoint, controlPoint2: CGPoint)
  func addQuadCurveToPoint(_: CGPoint, controlPoint: CGPoint)
  func appendPath(_: UIBezierPath)
  func bezierPathByReversingPath() -> UIBezierPath
  func applyTransform(_: CGAffineTransform)
  var empty: Bool { get }
  func containsPoint(_: CGPoint) -> Bool
  func fillWithBlendMode(_: CGBlendMode, alpha: CGFloat)
  func strokeWithBlendMode(_: CGBlendMode, alpha: CGFloat)
  func copyWithZone(_: NSZone) -> AnyObject
  func encodeWithCoder(_: NSCoder)
}

转换后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class UIBezierPath : NSObject, NSCopying, NSCoding {
  convenience init(ovalIn rect: CGRect)
  func move(to point: CGPoint)
  func addLine(to point: CGPoint)
  func addCurve(to endPoint: CGPoint, controlPoint1 controlPoint1: CGPoint, controlPoint2 controlPoint2: CGPoint)
  func addQuadCurve(to endPoint: CGPoint, controlPoint controlPoint: CGPoint)
  func append(_ bezierPath: UIBezierPath)
  func reversing() -> UIBezierPath
  func apply(_ transform: CGAffineTransform)
  var isEmpty: Bool { get }
  func contains(_ point: CGPoint) -> Bool
  func fill(_ blendMode: CGBlendMode, alpha alpha: CGFloat)
  func stroke(_ blendMode: CGBlendMode, alpha alpha: CGFloat)
  func copy(with zone: NSZone = nil) -> AnyObject
  func encode(with aCoder: NSCoder)
}

是不是感觉方法名清晰很多呢。

总结

以上就是 Swift 3 对 Objc 依赖库中的优化了,这次优化后,我们以后在用 Swift 来开发 iOS App 的时候,就不会再混合两种代码风格啦。

Swift 3.0 预告:将 Objc 库转换成更符合 Swift 语法风格的形式相关推荐

  1. 把0到9的数字转换成电话按钮上的字母

    问题 给定一个包含[0,9]中数字的整数数组,任务是打印所有可能的字母 数字可以表示的组合,数字到字母的映射(就像在电话按钮上)正在被跟踪,注意0和1不映射到任何字母.所有映射如下图所示: 写一个程序 ...

  2. allegro 16.6或者17.0把45度线转换成圆弧

    allegro 高速线绕等长时,把45度角转换成圆弧,先走成下图中下边45度线的形式,然后点菜单栏Route->Unsurpported Prototypes->Auto-interact ...

  3. angular 字符串转换成数字_Python基础语法大全:字符串的处理与使用

    本文来自牛鹭学院学员:邓瑞杰 字母处理 string.capitalize() 返回元字符串,且将字符串第一个字母转为大写,其它字母小写 string.title() 返回元字符串,且将字符串第一个字 ...

  4. sqlserver 存储过程 转oracle存储过程,SqlServer存储过程转换成Oracle储存过程语法常见问题...

    1. top order by 转换成 rownum order by 的问题 (子查询实现) 同级情况下的优先处理顺序: sqlserver: 先order by 再top oracle: 先row ...

  5. 使用一个拼音库,然后将拼音库转换成自己需要的格式

    做一个学做普通的app,里面有这个加声调的需求 var toneMap = {"ā": "1","á": "2",&qu ...

  6. ubuntu swift mysql_使用 Swift 3.0 操作 MySQL 数据库

    作者:Joe,原文链接,原文日期:2016-09-24 译者:shanks:校对:walkingway:定稿:CMB 如果你阅读过本主其他的 Swift 文章,你会发现我们是 Swift 服务器端开发 ...

  7. Swift - 将String类型的数字转换成数字类型

    Swift中,如果要把字符串转换成数字类型(比如整型,浮点型等).可以先转成NSString类型,让后再转. 1 2 3 4 //将文本框中的值转换成数字 var i = (tf1.text as N ...

  8. bat 等待输入_深蓝词库转换 - 简单的输入法词库转换工具

    深蓝词库转换 是一款 输入法词库转换 软件,支持包括 搜狗拼音.QQ拼音.Windows 10 微软拼音 在内的超过 20 种的输入法工具和词库.该程序支持 批量转换(一次拖拽多个词库文件,或者按住 ...

  9. python里class转换_python实现class对象转换成json/字典的方法

    python实现class对象转换成json/字典的方法 发布于 2016-03-28 08:05:44 | 153 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是 ...

最新文章

  1. Dreamwerver8下定义表单实现第一个登陆页面
  2. centos文本查看及处理相关的常用命令
  3. 生产服务器环境最小化安装后Centos 6.5优化配置备忘
  4. java中布尔值做比较_Java中的三态布尔值
  5. Coding Party 邀你出战!飞桨黑客马拉松线下场来啦
  6. CVPR 2020|超越H.265,中科大使用多帧数据改进视频压缩新方法
  7. 7-28 猴子选大王 (20 分) 最易理解的方法
  8. spring中bean属性scope
  9. 暑假集训第四场选拔赛 解题报告
  10. Visio 图案填充-设置形状格式
  11. 编译调试Apache HTTP Server
  12. 小米抢购软件_「晓满晓满晓」今日科技新鲜事:小米11、鸿蒙os、摩拜单车
  13. postgreSQL可视化工具pgAdmin3 导入表结构和数据
  14. 《游戏制作人手册》读书笔记
  15. OAI配置eNB时error解决
  16. 基于深度学习智能问答笔记
  17. 使用Windows Server 2003实现高可用故障转移群集(1)
  18. 无法运行rc.exe(已解决)
  19. 高级JavaScript第(五)篇
  20. python人机交互界面设计_python_GUI页面开发

热门文章

  1. 将模式对话框的返回值回送(PostBack)到服务端
  2. 在ASP.NET中值得注意的两个地方
  3. 使用man在线手册页
  4. 【Qt中文手册】QObject
  5. 【Git】git系统学习(一):常用指令
  6. windows串口控制linux,linux及windows下串口的使用.doc
  7. 7 自动开启网卡_淘汰的旧手机别扔掉,这样设置变身4G上网卡
  8. 【蓝桥java】递归基础之智力训练
  9. docker 安装使用 solr
  10. window.print()前端实现打印功能