2014-06-16 84 views
3

這給了我一個操場上的錯誤。在Swift中返回func的func

func returnAFunc() ->() 
{ 
    func f(){ println("hello") } 

    return f 
} 

現在我讀了一個名爲「returnAFunc」的func,它返回另一個不返回值的func。正確?但它不起作用。我必須這樣做:

func returnAFunc() ->() ->()  // or this (() ->()) 
{ 
    func f(){ println("hello") } 

    return f 
} 

好吧,看起來不正確。有人可以解釋嗎?

回答

4

您的第一個returnAFunc的類型簽名是() ->(),這意味着一個不帶參數且不返回任何內容的函數。你的第二個函數的類型是() ->() ->(),這意味着一個函數不接受任何參數,並返回一個類型爲() ->()的函數(即一個不帶參數且不返回任何內容的函數)。

我覺得你的基本誤解是()代表一個函數類型。相反,它和Void一樣。一旦你明白了這一點,唯一的另一個潛在的「陷阱」就是記住箭頭是右聯合的。

編輯:由於我得到了複選標記,我認爲值得引起注意IMSoP's answer,它很好地解釋瞭如何更詳細地閱讀該類型。

+0

是的,我相信由於你所指出的,我有一些困惑。我認爲他們需要在未來的Swift迭代中做得更清楚。 – AlwaysLearning

1

您的第一個示例顯示爲「函數returnAFunc不接受任何參數,並且不返回任何值。」第二個示例正確地將返回類型定義爲「函數returnAFunc不接受任何參數,並返回一個不帶參數且不返回任何參數的函數。」

當然,語法有點不可思議,但是一旦你習慣了它,看起來很簡單。

此外,夫特型void表示爲「()」,所以也可以將其解釋爲「功能returnAFunc需要一個空隙參數(這意味着沒有參數),並返回一個空隙型(這意味着無參數)。 「不過,我不確定實際情況是幕後發生了什麼。

3

()是一個空元組。斯威夫特使用它作爲一個void函數的返回類型,所以

() ->() 

那是不帶參數,沒有返回值的函數的簽名(無效)

所以,

func myFunc() ->() 

聲明函數不返回任何東西(無效),並且

func myFunc() ->() ->() 

聲明函數retu rns一個函數,它不接受任何參數並且不返回任何內容。

6

讓我們打破你的定義:

func returnAFunc() ->() 
  • func關鍵字
  • returnAFunc函數名
  • ()參數預期(空/無)
  • ->讀作 「退貨」
  • ()無效返回類型

所以這個函數不帶任何參數,並且什麼也不返回。

工作版本打破了這樣的:

func returnAFunc() ->() ->() 
  • func關鍵字
  • returnAFunc函數名
  • 預期(空/無)
  • ->讀作 「退貨」
  • ()參數
  • () ->() retu RN類型是另一個功能規格:
    • ()返回函數沒有讀成 「返回」
    • ()返回函數返回void

所以這個功能不帶參數的參數

  • ->,並返回(不帶參數並不返回任何內容的函數)。 (Eesh,即使用英文,我覺得有必要在那裏加上額外的括號......)

  • 相關問題