2015-06-30 146 views
1

同一功能的代碼,但在不同的方式斯威夫特功能標籤混亂

叫我寫道:

func findIndexOfString(str: String, arr: [String]) -> Int?{ 
    for (index, value) in enumerate(arr){ 
     if (value == str){ 
       return index 
     } 
    } 
    return nil 
} 

我可以調用這個函數像這樣,沒問題: (當然,在AppDeleagte類)

let index = findIndexOfString(name, arr: neighbors) 

然後我整個函數代碼移到另一個文件 - Function.swift(不是一類),我必須調用像這樣的功能:

let index = findIndexOfString(name, neighbors) // no arr: 

爲什麼?也許迅速將不在類中的函數視爲全局範圍C函數?

回答

0

當您將整體功能代碼移動到另一個文件時 - Function.swift(不在類中)然後您可以調用該函數,如let index = findIndexOfString(name, neighbors),因爲您在類的外部定義它,這意味着它是全局函數,而您可以隨時隨地訪問它。

除非將函數聲明爲私有,這會限制對定義文件的可見性,否則如果聲明爲內部(默認),則可以在模塊中的任何位置使用該函數,並且如果聲明爲公共。

有關功能的更多信息,可以參考Apple Documentation

UPDATE:

其結構和枚舉可以定義夫特方法事實是從C和Objective-C的主要區別。在Objective-C中,類是唯一可以定義方法的類型。在Swift中,您可以選擇是定義類,結構還是枚舉,還可以靈活地根據所創建的類型定義方法。

本地和外部參數名稱的方法:

方法對雨燕非常相似,他們在Objective-C語言的相似。

Swift默認給出方法中的第一個參數名稱本地參數名稱,並且默認給出第二個和後續參數名稱本地和外部參數名稱。這個約定與您在編寫Objective-C方法時熟悉的典型命名和調用約定相匹配,並且可以在不需要限定參數名稱的情況下進行表達式方法調用。

考慮這個Counter類,它定義了incrementBy(_:)方法的更復雜的形式:

class Counter { 
    var count: Int = 0 
    func incrementBy(amount: Int, numberOfTimes: Int) { 
     count += amount * numberOfTimes 
    } 
} 

incrementBy(_:numberOfTimes:)方法有兩個參數量和numberOfTimes。默認情況下,Swift僅將金額視爲本地名稱,但將numberOfTimes視爲本地名稱和外部名稱。您調用方法如下:

let counter = Counter() 
counter.incrementBy(5, numberOfTimes: 3) 
// counter value is now 15 

你並不需要爲第一個參數值來定義外部參數的名稱,因爲它的目的是從函數名incrementBy(_明確:numberOfTimes :)。但是,第二個參數由外部參數名稱限定,以便在調用該方法時明確其目的。

上面描述的行爲意味着Swift中的方法定義是用與Objective-C相同的語法風格編寫的,並且以自然的,富有表現力的方式進行調用。

欲瞭解更多信息,請參閱此Apple Document

而你可以檢查THIS視頻,你會在0:55得到你的答案。

+0

其實,我的問題是爲什麼我把我的代碼移到另一個文件中,我調用函數的方式改變了(沒有標籤 - arr :)? –

+0

嗨,我想我發現了另一個關於我的問題的解釋... http://www.objc.io/issues/16-swift/swift-functions/(調用所有函數和調用方法)。本文說,如果不包含在類中的代碼將被視爲功能,如果是,我將被視爲一種方法。我們稱之爲函數和方法的方式是不同的。 –

+0

我已經在我的答案中提供了一個文檔鏈接,您可以在那裏查看。 –