2017-09-15 92 views
-2

我有一個School結構:聲明不能被標記爲「靜態」,爲什麼

public structure School { 
    ... 
} 

然後,我有它的擴展,在我宣佈一個靜態的枚舉:

extension School { 
    // Compiler error: Declaration cannot be marked 'static' 
    static enum Level: String { 
    case Middle = "middle" 
    } 
} 

但我得到了上面評論中提到的編譯器錯誤,我如何在擴展中聲明一個靜態枚舉呢?

+3

請不要發佈無效的示例代碼。在Swift中沒有'structure'這樣的東西,應該是'struct'。請閱讀Apple的Swift書。 Swift不是Java,這不是你的第一個問題,你認爲Swift中的某些東西的工作方式與Java中的相同,只要你閱讀那本書就會變得清晰。 –

回答

4

enum是一種類型,因此它不能被標記爲靜態。即使您在類中聲明enum,也可以通過類類訪問,而不是通過實例訪問。在Swift中,static關鍵字可用於標記類型屬性,但由於enum本身是一種類型,因此它不能是屬性,因此不能標記爲static

struct School { 

} 

extension School { 
    enum Level: String { 
     case Middle = "middle" 
    } 
} 

你可以通過School型訪問enum,你並不需要創建一個實例。

School.Level.Middle 
+1

這應該是被接受的答案。只有類型的屬性和方法可以標記爲靜態。如果你有一個具有靜態方法或屬性的類,並且要求它被子類化,它應該被標記爲類而不是靜態的。只是對問題的補充。 –

0

在Java中,內部類型可以訪問封閉類型的成員。 static關鍵字用於阻止此類訪問,並指示該類型與其封閉類型的成員無關。

斯威夫特從一開始就沒有這樣做,所以它不適用於static內部類型。

1

只有類型的屬性和方法可以標記爲靜態。 (Enum是一個像struct這樣的值類型)另外,如果你有一個擁有靜態方法或屬性的類,並且要求它被子類化,它應該被標記爲類而不是靜態的。

相關問題