2014-10-08 72 views
2

我开始与Swift通过开发一个简单的应用程序与一个tableView,一个服务器的请求和一些更多的东西。我意识到UITableViewDelegate协议中的每个方法都以相同的方式命名(我猜它可能与其他协议相同),并且通过更改传递给这些方法的参数(通过这种方式称为“tableView”)来实现差异, 。为什么所有方法在委托中都有相同的名称?

我想知道为什么苹果会做这样的事情,因为当我尝试从这个协议实现方法时有点麻烦,因为我无法开始键入“didSele ...”只是为了自动填充“didSelectRowAtIndexPath” ;相反,我必须输入“tableView”才能获得所有可用方法的列表,并手动搜索第二个参数为“didSelectRowAtIndexPath”的方法。

一切工作正常,但只是想知道为什么可以这样做。

谢谢你这么多的意见:)

PS:有一个截图约我在说什么:

Image showing a list of "tableView" functions with different parameters names

回答

2

Swift被设计为与Objective-C兼容。毕竟,几乎所有现有的OS X和iOS API都在Objective-C和C中(在这里和那里都有一些C++代码)。 Swift需要能够使用这些API,从而以某种方式支持大多数Objective-C功能。 Objective-C最重要的特性之一就是如何进行方法调用。

例如,在C,有3个参数的函数被调用是这样的:

foo(1, "bar", 3); 

你不知道的参数应该是。所以在Objective-C中,参数与方法名交错。例如,一个方法的名称可能是fooWithNumber:someString:anotherNumber:,它会被称为像:

[anObject fooWithNumber:1 someString:@"bar" anotherNumber:3]; 

斯威夫特现在尝试与此Objective-C的功能不兼容。因此它支持一种命名参数的形式。在斯威夫特的通话将如下所示:

anObject.foo(number:1, someString:@"bar", anotherNumber:3) 

通常斯威夫特方法定义是这么写的,你不需要明确地命名的第一个参数,如:

anObject.foo(1, someString:@"bar", anotherNumber:3) 

如果你查查UITableViewDelegate protocol documentation并选择Objective-C,你可以看到所有这些方法都以tableView:开头来指定发件人,但从那时起它们就非常不同了。您引用的列表是从Objective-C到Swift命名约定的转换结果。

1

它仅仅是命名约定。在Objective-C中是一样的。你可以看看这个page。没有这些惯例,这将是一个完整的混乱。

+0

很好的参考资料,我完全忘了它仍然存在......但这只是故事的一半。另一部分是这些Objective-C方法名称如何转换为Swift。 – DarkDust 2014-10-08 11:01:27

1

方法名不仅是第一个单词,而且是参数的公开名称。

E.g.它的方法名称不是tableView(),而是tableView(_:didSelectRowAtIndexPath:)

相关问题