2014-10-08 76 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:)

相關問題