2016-09-28 60 views
3

我不能在擴展名中使用私有屬性。我的擴展名在另一個文件中。不能在其他文件的擴展名中使用私有屬性

如何在擴展中使用私有屬性?

編輯:因爲它不是從swift2改爲swift3

+0

您是否嘗試過使用'fileprivate'而不是'private'? – thedjnivek

+2

@thedjnivek'我的擴展名在另一個文件中。' – nhgrif

+0

你確定在Swift 2中工作過? Swift 2中的「private」限制對*相同源文件*的訪問。 –

回答

6

在你的類型的擴展使用屬性的規則實際上並沒有從使用特性其他地方的規則有什麼不同。

如果該財產被宣佈爲private,它不能用於除已聲明的範圍內的任何地方。這意味着即使在同一個文件中。

如果該屬性被聲明爲fileprivate,則只能在聲明的文件內使用(以及在該文件中通過任何內容)。

如果聲明屬性爲internal(默認值),則只能在聲明的模塊內使用(並且在該文件中使用任何內容)。

如果屬性聲明publicopen,它可以通過導入它在聲明的模塊文件中使用的模塊內的任何以及模塊的外部。

沒有辦法以這樣一種方式聲明一個變量,使其可以被類型的擴展使用,但不能被類型之外的其他事物使用。這實際上並不是從Swift 2到Swift 3的變化。這一直是這種情況。你在找什麼其他語言稱爲protected。 Swift沒有,並且從來沒有從其他語言的protected等效。

您可以得到的最接近的結果是在單個文件中聲明類型及其所有擴展名,並且不允許在該文件中聲明任何其他類型或類型的擴展名。然後,您可以將屬性標記爲fileprivate,並通過該文件中的擴展名使用它們。這仍然不允許在該文件之外通過該類型的擴展來使用該屬性,並且它不會阻止未來的開發者在使用該屬性的該文件中添加另一類型或另一類型的擴展。

+0

感謝您的回答,這對我來說非常清楚。但我只需要清理我的代碼。我只想說清楚一點。所以爲什麼我把主文件中的擴展名分開。是的,你完全理解。我不希望任何職業接觸這個屬性。您更喜歡哪一種讓它成爲內部屬性(我可以分開文件)並將其設置爲文件私有(將它們保留回主文件中) – Oniikal3

+0

不同的情況需要不同的用例。 – nhgrif

+0

我的擴展名用於在對象中設置樣式。我決定現在使用fileprivate。我會讓他們回到主文件。 – Oniikal3

相關問題