Що таке "відкрите" ключове слово у Swift?


334

The ObjectiveC.swiftФайл з стандартної бібліотеки містить наступні кілька рядків коду навколо лінії 228:

extension NSObject : Equatable, Hashable {
  /// ...
  open var hashValue: Int {
    return hash
  }
}

Що open varозначає в цьому контексті або що таке openключове слово взагалі?


2
Можливо, пов'язані: stackoverflow.com/questions/24003918/… ("Яка різниця між openі public?")
Ахмад Ф

Побічна примітка: ключове слово "відкрито" походить від поняття "відкрити для розширення, закрито для модифікації"
Sazzad Hissain Khan

Відповіді:


572

open це новий рівень доступу в Swift 3, представлений впровадженням

Він доступний із знімком Swift 3 з 7 серпня 2016 року та з Xcode 8 beta 6.

Коротко:

  • openКлас доступний і підкласи поза визначального модуля. Учасник openкласу доступний і доступний для перезапису поза визначальним модулем.
  • publicКлас доступний , але НЕ підкласи поза визначального модуля. Учасник publicкласу доступний, але не може бути замінений за межами модуля визначення.

Так openє те, що publicраніше було у попередніх випусках Swift, і доступ до publicних був обмежений. Або, як Кріс Леттнер зазначає в SE-0177: Дозволити розмежувати доступ між громадськістю та доступністю для публіки :

"Відкритий" тепер просто "більше публічний, ніж публічний", забезпечуючи дуже просту та чисту модель.

У вашому прикладі open var hashValue- це властивість, яка є доступною і може бути замінена в NSObjectпідкласах.

Для отримання додаткових прикладів та деталей дивіться SE-0117 .


16
Так publicу Swift 3 - це як public finalу Swift 2, і openце як public?
Clashsoft

16
@Clashsoft: "відкрити" у Swift 3 - це як "public" у Swift 2. "public" у Swift 3 не має еквівалента у Swift 2. (Остаточний клас взагалі не може бути підкласом, навіть не в тому ж модулі.)
Martin R

59
Це смішно контрутуючий. Дякую за резюме.
GoldenJoe

7
Погодьтеся з @MikeS, і відсутність зворотної сумісності робить це жахливим безладом.
HughHughTeotl

14
Яблуко @MikeS - думай по-іншому, навіть якщо це зайве.
Варун Натх

12

Читати відкрито як

відкритий для успадкування в інших модулях

Я повторюю відкриті для успадкування в інших модулях. Отже, відкритий клас відкритий для підкласифікації в інших модулях, що включають визначальний модуль. Відкриті параметри та функції відкриті для переосмислення інших модулів. Найменш обмежуючий рівень доступу. Це так само добре, як публічний доступ визнає, що те, що є загальнодоступним, закрито для спадкування в інших модулях.

З Документів Apple :

Відкритий доступ застосовується лише до класів та членів класу, і він відрізняється від загальнодоступного наступним чином:

  1. Класи з загальнодоступним доступом або будь-яким обмежуючим рівнем доступу можуть бути підкласировані лише в модулі, де вони визначені.

  2. Члени класу з загальнодоступним доступом або будь-яким обмежуючим рівнем доступу можуть бути замінені підкласами лише в модулі, де вони визначені.

  3. Відкриті класи можуть бути підкласами в модулі, де вони визначені, і в будь-якому модулі, який імпортує модуль, де вони визначені.

  4. Члени відкритого класу можуть бути замінені підкласами в модулі, де вони визначені, і в будь-якому модулі, який імпортує модуль, де вони визначені.

5

Open - це рівень доступу, був запроваджений для накладення обмежень на успадкування класу Swift.

Це означає, що рівень відкритого доступу може застосовуватися лише до класів та членів класу .

У класах

Відкритий клас може бути підкласом у модулі, визначеному в ньому, і в модулях, які імпортують модуль, у якому визначено клас.

У класах

Те саме стосується членів класу. Відкритий метод може бути замінений підкласами в модулі, який визначено в модулях, які імпортують модуль, у якому визначено метод.

НЕОБХІДНІСТЬ ЦЕ ОНОВЛЕННЯ

Деякі класи бібліотек та фреймворків не розроблені для підкласів, і це може призвести до несподіваної поведінки. Рідна бібліотека Apple також не дозволить переосмислити ті самі методи та класи,

Тож після цього доповнення вони застосовуватимуть державний та приватний рівні доступу відповідно.

Більш детально ознайомтеся з документацією Apple щодо контролю доступу


1

За винятком підкласу, анкета open class funcтакож доступна з будь-якої точки вашого проекту. Скажімо, ви визначаєте функцію відкритого класу у вашому класі Util так, як це

open class Utils: NSObject {
    open class func printHello() {
        print("Hello from utils")
    }
}

Тоді в будь-якому місці контролерів перегляду ви можете просто отримати доступ до цього методу, зателефонувавши

Utils.printHello()

3
Ця відповідь не пояснює, чим це відрізняється від публічного, оскільки ви теж можете це робити з громадськістю.
Хосе Рамірес

Потрібно ще кілька пояснень з цього приводу
д-р Аслам Ансарі

1

відкриті приходять для гри при роботі з декількома модулями.

відкритий клас доступний і підкласифікований поза визначальним модулем. Відкритий член класу доступний і перезаписується поза визначальним модулем.


0

відкритим є лише для іншого модуля, наприклад: какао-стручки або одиничний тест, який ми можемо успадкувати або переотримати

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.