2015-04-17 64 views
1

我想在Swift中爲泛型類添加一個類型(又稱靜態)方法。這是代碼。如何將類型方法添加到Swift中的泛型類型?

class StateArchive<T> { 
    class func emptyAllArchives() { 
     // do something 
    } 
} 

// the compiler emits an error: "Argument for generic parameter 'T' could not be inferred" 
StateArchive.emptyAllArchives() 

我可以得到上面的代碼在地方的T提供的類型,像這樣進行編譯:

StateArchive<AnyObject>.emptyAllArchives()

這看起來很笨拙,但是。最初我認爲這樣做的原因可能是人們可以創建類型爲T的類變量。在操場上的快速測試顯示編譯器發出消息說:

「類存儲的屬性尚未支持泛型類型」。

有誰知道如何在泛型類型中創建一個類型方法,並讓客戶端調用此方法時不提供類型替換T?

+1

我沒有任何意義,您可以在不提供類型的情況下調用該靜態函數 - 如果在'emptyAllArchives'方法中使用'T'而不提供'T'類型會發生什麼? – ABakerSmith

+0

我沒有意識到你可以在靜態函數中訪問T.現在有道理,爲什麼你需要指定T的類型。謝謝! – MaxK

回答

7

當遇到一個不符合預期效果的泛型問題時,爲了幫助理解問題,考慮如果用不同的具體類型替換佔位符會發生什麼情況。

因此,例如,假設你定義了以下(這不會編譯你的理由,但想象它所做的那樣):

class C<T> { 
    static var a: [T] = [] 

    static func addElement(i: T) { 
     a.append(i) 
    } 
} 

真的,當你寫class C<T>,你是不是寫一類。你正在寫一個無限數量的可能類的藍圖 - C<Int>C<String>,C<AnythingElse>

在這種情況下,假設你寫了C.addElement(1) - 所以T將是Int。然後,你寫了C.addElement("one")C.a現在是否包含一個或兩個項目? a的類型是什麼?

也許最合理的答案是將有一個C<Int>.a與一個元素和C<String>.a與一個元素。但是這可能會讓人感到困惑,並且似乎沒有用例來證明這種功能。

通常情況下,靜態方法和屬性很少使用,而且您可能會發現使用非靜態成員和方法以及單例模式(甚至可能不會)更好。如果您仍然需要類似靜態功能,則最好使用通用的免費功能(例如func emptyArchive<T: C>(c: C) { })。

+0

你所描述的是有道理的。感謝您爲我清理這個。我最終創建了一個單獨的非泛型類,並且讓它實現了我需要的靜態函數。這是有效的,因爲我不在任何靜態函數中訪問T. – MaxK

相關問題