Swift 中代理方法怎么命名
发布时间:2011-06-30 07:17:30 文章来源:www.iduyao.cn 采编人员:星星草
Swift 中代理方法如何命名?
可以说 Swift 语言 http://www.maiziedu.com/course/16/是 Objective-C 的后继之人,毕竟也算是师出同门。但是他们语法看来不像,用起来也不像,给人的感觉也不一样。有些在 Objective-C 上用得好端端的案例,在 Swift 上却看起来怪怪的,如方法命名。在 Objective-C 中,方法名尽量完整:
[string dataUsingEncoding:NSUTF8StringEncoding];
在 Swift 2.2 中,这样调用看着就没那么优雅:
string.dataUsingEncoding(NSUTF8StringEncoding)
在 Swift 3 中,这个方法看起来就顺眼多了:
string.data(using: .utf8)
所以,像 Swift 3 中这样的命名方式,才是 Swift 的正确姿势。而 Objective-C 的方式也只适用于 Objective-C。我觉得 这篇文章 应该能帮你在新世界中修炼你的方法命名习惯。
无论是三方框架,还是平时开发中编写的代码,都应该更新为更为 Swift 的方式。下面,我将着重说一下代理的命名。
Swift 中代理的理解和 Objective-C 并不完全相同。Objective-C 偏向于 “发送者” 与 “接收者”。Apple 的 Objective-C 文档也倾向于这种方式。比如 UIResponder 的 isFirstResponder 方法,文档上是这样解释的:
Returns a Boolean value indicating whether the receiver is the first responder.
返回一个接收者是否是第一响应者的标识(布尔值)。
所以,在设置 target-action 的时候,参数名理所当然的称为 sender :
- (void)buttonTapped:(UIButton *)sender {
代理方法的定义规则和这个类似:在 Objective-C 中,代理方法的第一个参数总是发送者。让我们来看看为什么会这样:如果你(接收者,即实现代理方法的对象)是多个相同类型对象的代理,那么你需要这个参数来进行区分。所以代理方法提供了第一个参数,方便分别处理。(译注:例如多个 UITextField 的 delegate 都是 self 的时候,就需要进行区分是哪个 UITextField 调用的代理方法)。
下面我会用到 Backchannel SDK 中的例子,为了简单起见,我简化了一些类名。
这个 SDK 中代理方法分为两大类。第一类是事件触发的代理:
- (void)messageFormDidTapCancel:(BAKMessageForm *)messageForm;
在 Swift 中,翻译为:
func messageFormDidTapCancel(_ messageForm: BAKMessageForm)
这要放在 Swift 3 中就不那么顺眼了。在 Swift 3 中,应该去调冗余部分( messageFrom 重复了),并且第一个参数应该有别名,而不应该用下划线代替。
第二类是事件触发,并且还带有部分数据的代理方法。对于这类,我举了以下两个例子:
- (void)messageForm:(BAKMessageForm *)messageForm didTapPostWithDraft:(BAKDraft *)draft;- (void)messageForm:(BAKMessageForm *)messageForm didTapAttachment:(BAKAttachment *)attachment;
在 Swift 中,翻译为:
func messageForm(_ messageForm: BAKMessageForm, didTapPostWithDraft draft: BAKDraft)
func messageForm(_ messageForm: BAKMessageForm, didTapAttachment attachment: BAKAttachment)
简直辣眼睛。为啥两个方法都叫 messageFrom ?并且这个方法开头的名词也不合常理:一般建议名词是方法返回的对象类型(比如 NSString 的 data(using:) ,就是返回的 Data )。但是这个例子中,却并不需要返回任何 “message form”。这里指的 “message form”其实应该是第一个参数的名字,真是个令人纠结的方法名。
其实这两种类型的代理方法,都可以通过将“sender”移到行末,把动词提到最前来解决命名的问题。对于第一个例子来说,是 sender 想告诉代理点击取消事件( didTapCancel ),而不是 messageFormDidTapCancel ,所以应该改为:
func didTapCancel(messageForm: BAKMessageForm)
这样看起来好多了。事件的名称被提在了最前作为方法名,能很直观的看出方法的作用。我觉得,最好再将介词作为参数别名,这样调用的时候就更优雅了:
func didTapCancel(on messageForm: BAKMessageForm)
目前我还没找到关于介词的使用规范。不过我会在不同情况下,选择使用“on”,“for”,“with”,“in”。用户是点击在表单“上”的,所以我觉得这里用“on”比较合适。
接下来再来看看,代理方法有数据返回的情况。将动词提到最前,选择合适的介词就能有效解决这个问题了。
之前是:
func messageForm(_ messageForm: BAKMessageForm, didTapPostWithDraft draft: BAKDraft)
而更 Swift 化的是:
func didTapPost(with draft: BAKDraft, on messageForm: BAKMessageForm)
和
func didTap(attachment: BAKAttachment, on messageForm: BAKMessageForm)
这种命名规则只是我归纳出来的,并没有经过他人印证,但我觉得这要比现在代理方法命名的规则要好得多。之后,我可能还会自己的 Swift 代理方法中使用这种规则。
下面列举了 UITableView 的 delegate 与 data source 方法,以及这些方法在未来可能的样子:
func numberOfSections(in tableView: UITableView) -> Int
numberOfSections 遵循了前文提到的规则,看起来很优雅。
但其余的方法看起来就不那么好了:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
更为漂亮的命名是:
func numberOfRows(inSection section: Int, in tableView: UITableView) -> Int
func cellForRow(at indexPath: IndexPath, in tableView: UITableView) -> UITableViewCell
func didSelectRow(at indexPath: IndexPath, in tableView: UITableView)
文章来源:SwiftGG
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
Swift 错误
转载自http://blog.csdn.net/longhai0long/article/details/38379247
刚看swift开发IOS,在使用Core Data框架时遇到了...
-
Swift游戏实战-跑酷熊猫 10 视差滚动背景
原理
实现
勘误
“实现”的视频中有个错误,如下
背景移动时有个错误,看...
-
【100天爱上Swift】Day 1: Hello World!
前言
Swift已经出来好久了,7月份的语言排名已经到了第16位,可见从Apple的开发部门到各种I...
-
「Swift学习笔记」使用AV Foundation框架为APP加上背景音乐并进行简单控制
用Swift语言进行iOS开发,如需加上背景音乐并进行简单地...
-
Swift入门篇-基本类型(3)
一:元组
格式
变量或常量关键字 元组变量 = ( 变量,变量, …)
说明:
1: 元组变量还是一个...
-
学了一年C#,也在工作室做了一年的web项目开发,现在终于有机会转下语言了,就是你了Swift~
下载了2部Swift的视频,现在因为有两个网页的...
-
The Swift Programming Language 中文手册导航
Write the code. Change the world.
(翻译进行中, 蓝色部分为已经翻译完,正在校正...
-
Swift基础常识之变量
Swift 小白们速度入门
美国那哥们4小时自学swift 写出了flappy bird。 你们呢
1. 首先 打开你们的Xcode6....
-
Swift基础加强_跟我打500行
今天上午、 继续练习了一下swift
然后 首先打开Xcode6
紧接着 我们创建一个playGround。 playGrou...
-
幼谈苹果新开发语言:Swift和苹果的用心
今天是个值得纪念的日子:因为苹果的WWDC大会。苹果的每次WWDC(全球开发者大会)举行都让我...