2016-09-18 24 views
4

我的Xcode最近已經更新到Xcode中8斯威夫特3.我所注意到的是,附加行動的ViewController功能時,在這種風格的產生:Swift 3:爲什麼符號_是在發送者之前添加動作參數?

@IBAction func methodName(_ sender: UIButton) { 

} 

我不明白什麼是目的那裏有_。任何人都可以解釋爲什麼它在那裏?在之前的Swift 2.2中,它不在那裏。

另一個問題是,以前的項目我已經看教程後已遷移到斯威夫特3,並有看起來像這樣一個方法:

func toggleButtons(toggle: Bool) { 
    yesButton.isUserInteractionEnabled = toggle 
    noButton.isUserInteractionEnabled = toggle 
} 

我調用此方法是這樣的:toggleButtons(false)仍不傳遞參數名稱。現在,migrator如下所示更改它,但稍後在代碼中調用方法時沒有任何更改。

func toggleButtons(_ toggle: Bool) { 
    yesButton.isUserInteractionEnabled = toggle 
    noButton.isUserInteractionEnabled = toggle 
} 

與以前的情況不一樣嗎?

+0

工作這不是http://stackoverflow.com/questions/38343497/swift-3-first-parameter-names的副本,因爲這個問題是關於Swift 2和Swift 3之間第一個參數名稱的更改,而這個問題是關於**爲什麼** Xcode在生成'@ IBAction'方法時禁用參數名稱。 –

回答

6

其他答案(其中一個已被刪除)涵蓋了_的含義:它在您調用方法時消除了關鍵字。

但是,您的問題具體是關於「將操作附加到ViewController」。

具有@IBAction屬性的方法可以連接到故事板(或xib)中的控件。這意味着方法的名稱將作爲字符串存儲在故事板中,並且將使用Objective-C消息發送系統調用。所以確切的名稱,以及名稱如何轉換爲Objective-C,在這裏非常重要。

如果您聲明方法func methodName(sender: UIButton),那麼它的Objective-C名稱是methodNameWithSender:

如果您聲明方法func methodName(_ sender: UIButton),那麼它的Objective-C名稱是methodName:

iOS和macOS都有一些稱爲「響應者鏈」的東西,它可以讓系統搜索可以處理動作的對象(「響應者」)。您可以將故事板中的控件連接到First Responder(位於文檔大綱的頂部),讓系統執行此操作。大多數情況下,您可以使用macOS中的菜單項執行此操作,但還有其他用途。

無論如何,有一些標準的行動,如cut:,copy:paste:。例如,您可以將切割菜單項的操作設置爲將cut:發送給First Responder。如果你要實現的cut:方法在您的視圖控制器,至關重要的是,它的名字(折算到的Objective-C)是精確cut:,而不是cutWithSender:。如果它被命名爲cut:,則系統會在搜索響應者鏈時找到它,但如果它被命名爲cutWithSender:,則系統將而不是找到它,並且您會問爲什麼菜單項不起作用。

Xcode知道這一點,所以它總是創建形式爲@IBAction func action(_ sender: UIButton)的操作方法,如果您正在實現需要通過搜索響應者鏈來查找的操作,則省略參數中的關鍵字。

在Swift 3中,方法的每個參數默認都有一個關鍵字,包括第一個參數。回到Swift 2,第一個參數不是默認有一個關鍵字,所以第一個參數的_在Swift 2中是多餘的(並且會產生編譯器警告)。這就是爲什麼Xcode 8(Swift 3)放入_但Xcode 7(Swift 2.2)沒有。

這也是爲什麼你toggleButtons例如在Xcode 7

+0

感謝您的詳細解答。我更新了我的問題。如果你能幫助我更多地瞭解它,我將不勝感激。我剛開始學習iOS。 – Marat

1

這意味着您在調用方法時不必命名該參數。

obj.methodName(button) 

// no need for 
obj.methodName(sender: button) 

在早期版本的雨燕,這是在方法調用的第一個參數的特殊缺省行爲,但在Swift3已經統一。現在所有參數都需要名稱,除非您退出(使用_)。

+0

感謝您的幫助@Thilo! – Marat

相關問題