Чи має Swift модифікатори доступу?


273

У екземплярі Objective-C дані можуть бути public, protectedабо private. Наприклад:

@interface Foo : NSObject
{
  @public
    int x;
  @protected:
    int y;
  @private:
    int z;
  }
-(int) apple;
-(int) pear;
-(int) banana;
@end

Я не знайшов жодної згадки про модифікатори доступу у посиланні Swift. Чи можливо обмежити видимість даних у Swift?


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

Додано відповідь оновлену для остаточної версії Xcode 6.1.1
holroy

Відповіді:


419

Станом на Swift 3.0.1 є 4 рівні доступу , описані нижче від найвищого (найменш обмежувального) до нижнього (найбільш обмежувального).


1. openіpublic

Увімкнути використання об'єкта поза визначальним модулем (ціллю). Зазвичай ви використовуєте openабо отримуєте publicдоступ, коли вказуєте публічний інтерфейс для фреймворку.

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

  • public класи та члени класу можуть бути підкласифіковані та замінені лише у межах визначального модуля (цілі).
  • open класи та члени класу можуть бути підкласифіковані та замінені як усередині, так і поза визначальним модулем (ціллю).

// First.framework – A.swift

open class A {}

// First.framework – B.swift

public class B: A {} // ok

// Second.framework – C.swift

import First

internal class C: A {} // ok

// Second.framework – D.swift

import First

internal class D: B {} // error: B cannot be subclassed

2. internal

Дозволяє використовувати сутність у визначеному модулі (цілі). Зазвичай ви користуєтесь internalдоступом, визначаючи внутрішню структуру програми або рамки.

// First.framework – A.swift

internal struct A {}

// First.framework – B.swift

A() // ok

// Second.framework – C.swift

import First

A() // error: A is unavailable

3. fileprivate

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

// First.framework – A.swift

internal struct A {

    fileprivate static let x: Int

}

A.x // ok

// First.framework – B.swift

A.x // error: x is not available

4. private

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

// First.framework – A.swift

internal struct A {

    private static let x: Int

    internal static func doSomethingWithX() {
        x // ok
    }

}

A.x // error: x is unavailable

37
Може хтось пояснить мені, чому це не велика справа?
Zaky German

15
Там завжди є деякі методи або змінні в ООП , які повинні бути приватними або захищеними. Це дозволяє реалізувати дизайн SOLID , оскільки великі методи поділяються на декілька менших, кожен з яких є власною відповідальністю, які можна перекрити, але для публічного використання повинен бути доступний лише "основний" метод.
акашівський

19
Мені особисто не подобаються такі рішення, як ті, що підкреслюють / спеціальні, що ведуть «приватні» методи. Навіть якщо гарантовано, що я для себе буду єдиною людиною, яка коли-небудь переглядає цей код, це робить код більш збереженим / менш схильним до помилок, тому що компілятор просто заважатиме вам робити те, чого ви не повинні робити. Тому я думаю, що вони повинні якомога швидше вийти з "механізмів контролю доступу", щоб люди не звикли звикнути до шкідливих звичок.
Йонас Ешманн

10
У примітках з бета-версією Xcode 6 йдеться: "Контроль доступу (приватні / приватні члени) у цьому насінні не ввімкнено. (15747445)"
Martin Ullrich

9
@alcalde Ідея публічного інтерфейсу дуже цінна. Якщо ви маєте намір, що весь код у класі повинен містити функції, що входять до загальнодоступного API, я думаю, що це досить обмежує. З іншого боку, наявність визначеного публічного API дозволяє впровадженню змінюватись (включаючи використання приватних методів), не порушуючи споживачів. Якщо хтось «потребує» використовувати метод внутрішнього класу, я вважаю, що він нерозуміє межі функціональності класу (або намагається використовувати клас баггі).
jinglesthula

26

Swift 4 / Swift 5

Як зазначено в документації Swift - Контроль доступу , Swift має 5 контролів доступу :

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

  • внутрішній : до нього можна отримати доступ лише з об'єктів модуля. Це рівень доступу за замовчуванням.

  • fileprivate та private : доступ до них можна отримати лише в обмеженому обсязі, де ви їх визначаєте.



Яка різниця між відкритим та публічним ?

open - це те саме, що і загальнодоступні в попередніх версіях Swift, вони дозволяють класам з інших модулів використовувати їх і успадковувати, тобто: їх можна підкласифікувати з інших модулів. Крім того, вони дозволяють членам інших модулів користуватися ними та змінювати їх. Така ж логіка стосується їх модулів.

public дозволяє класам з іншого модуля використовувати їх, але не успадковувати їх, тобто: їх не можна підкласифікувати з інших модулів. Крім того, вони дозволяють членам інших модулів використовувати їх, але НЕ перекривати їх. Для своїх модулів вони мають однакову логіку відкритих (вони дозволяють класам їх використовувати та успадковувати; вони дозволяють членам використовувати та переосмислювати їх).


Яка різниця між файловим та приватним ?

Ви можете отримати доступ до файлів файлів з усіх своїх файлів.

доступ до приватних може бути доступний лише з їх єдиної декларації та до розширень цієї декларації, які знаходяться в одному файлі; Наприклад:

// Declaring "A" class that has the two types of "private" and "fileprivate":
class A {
    private var aPrivate: String?
    fileprivate var aFileprivate: String?

    func accessMySelf() {
        // this works fine
        self.aPrivate = ""
        self.aFileprivate = ""
    }
}

// Declaring "B" for checking the abiltiy of accessing "A" class:
class B {
    func accessA() {
        // create an instance of "A" class
        let aObject = A()

        // Error! this is NOT accessable...
        aObject.aPrivate = "I CANNOT set a value for it!"

        // this works fine
        aObject.aFileprivate = "I CAN set a value for it!"
    }
}



Які відмінності між контролем доступу Swift 3 та Swift 4?

Як згадується у пропозиції SE-0169 , до Swift 4 було додано єдине уточнення: розширення сфери контролю приватного доступу для доступу з розширень цієї декларації в одному файлі; Наприклад:

struct MyStruct {
    private let myMessage = "Hello World"
}

extension MyStruct {
    func printMyMessage() {
        print(myMessage)
        // In Swift 3, you will get a compile time error:
        // error: 'myMessage' is inaccessible due to 'private' protection level

        // In Swift 4 it should works fine!
    }
}

Таким чином, немає необхідності оголошувати myMessageв fileprivate бути доступним у всьому файлі.


17

Якщо говорити про створення "приватного методу" у Swift або ObjC (або ruby, java або ...), ці методи насправді не є приватними. Фактичного контролю доступу навколо них немає. Будь-яка мова, яка пропонує навіть невелику інтроспекцію, дозволяє розробникам отримати ці значення поза класом, якщо вони дійсно хочуть.

Тож, про що ми говоримо тут, - це спосіб визначити інтерфейс із загальнодоступною діяльністю, який просто представляє функціонал, який ми хочемо, і "приховує" решту, що ми вважаємо "приватним".

Механізм Swift для оголошення інтерфейсів є protocol, і він може бути використаний для цієї мети.

protocol MyClass {
  var publicProperty:Int {get set}
  func publicMethod(foo:String)->String
}

class MyClassImplementation : MyClass {
  var publicProperty:Int = 5
  var privateProperty:Int = 8

  func publicMethod(foo:String)->String{
    return privateMethod(foo)
  }

  func privateMethod(foo:String)->String{
    return "Hello \(foo)"
  }
}

Пам'ятайте, що протоколи - це першокласні типи і їх можна використовувати в будь-якому місці. І , використовуючи цей спосіб, вони відкривають лише власні інтерфейси, а не інтерфейси, що реалізуються.

Таким чином, доки ви використовуєте MyClassзамість MyClassImplementationтипів параметрів тощо, все повинно просто працювати:

func breakingAndEntering(foo:MyClass)->String{
  return foo.privateMethod()
  //ERROR: 'MyClass' does not have a member named 'privateMethod'
}

Є деякі випадки прямого присвоєння, коли вам потрібно бути явним з типом, а не покладатися на Swift, щоб зробити висновок про це, але це навряд чи здається вимикачем:

var myClass:MyClass = MyClassImplementation()

Використання протоколів таким чином є семантичним, досить стислим, і на мій погляд дуже схоже на розширення класів, які ми використовували для цієї мети в ObjC.


1
Якщо протоколи не дозволяють нам мати аргумент за замовчуванням, то як я можу створити відкритий метод із необов'язковими параметрами, який все ще відповідає протоколу?
bdurao

Я не розумію, що ти маєш на увазі. Далі створюється загальнодоступний метод з необов’язковим параметром. Здається, це не проблема: gist.github.com/anonymous/17d8d2d25a78644046b6
jemmons

Чомусь необов'язковий параметр не працює так, як слід у моєму проекті, вже випробував щось подібне до вашого прикладу GitHub. Оскільки ми не можемо встановити параметр за замовчуванням у протоколі, я застряг і закінчив задавати питання. Дякуємо за спробу допомогти.
bdurao

Всі ми знаємо, що все можна зламати. Нам просто потрібно дещо замовити, навіщо нам потрібні модифікатори доступу
canbax,

14

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

Однак Apple, можливо, очікує, що люди використовуватимуть « протоколи » (інтерфейси, які називаються іншим світом), і заводський шаблон дизайну, щоб приховати деталі типу реалізації.

Це часто хороша модель дизайну, яка використовується в будь-якому випадку; оскільки це дозволяє змінювати ієрархію класів реалізації , зберігаючи систему логічного типу однаковою.


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

4
Це працювало б краще, якби був спосіб приховати клас реалізації протоколу, але цього, схоже, немає.
Девід Молес

Чи може хтось навести наочний приклад цього шаблону?
bloudermilk

Що ж, ця відповідь була дійсною в попередній версії Swift, здається, вона більше не відповідає :) Будь ласка, перевірте мою відповідь .
Ахмад Ф

12

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

Приклад:

protocol HuhThing {
  var huh: Int { get set }
}

func HuhMaker() -> HuhThing {
   class InnerHuh: HuhThing {
    var innerVal: Int = 0
    var huh: Int {
      get {
        return mysteriousMath(innerVal)
      }

      set {
       innerVal = newValue / 2
      }
    }

    func mysteriousMath(number: Int) -> Int {
      return number * 3 + 2
    }
  }

  return InnerHuh()
}

HuhMaker()
var h = HuhMaker()

h.huh      // 2
h.huh = 32 
h.huh      // 50
h.huh = 39
h.huh      // 59

innerVal та mysteriousMath тут ховаються від зовнішнього використання, а спроба копати свій шлях до об'єкта повинна призвести до помилки.

Я лише частину шляху перечитаю документи Swift, тому, якщо тут є недолік, будь ласка, вкажіть це, я хотів би знати.


ОК, я теж думав над цим рішенням, але поясніть мені, чому я не можу отримати доступ до h.huh.innerVal?
Сем

Swift є безпечним для типу, і єдине, що зовнішній світ знає про h, це те, що він відповідає HuhThing. HuhThing не містить ніякої інформації про властивість, яку називають innerVal, і тому спроба отримати доступ до неї є помилкою.
Дейв Капп

8
Ще доступний: Preflect(h)[0].1.value // 19
Джон Естропія

2
Приємний знайдений там Джон, я не знав про роздуми. Здається, перетворюють об'єкти в Tuples - чи є якась офіційна документація на цю функцію чи інші метапрограмування у Swift? Я переглянув посібник з мов на iBooks, але цього не бачу.
Дейв Капп

1
@JohnEstropia Я не думаю, що рефлексія не має значення. У Java (більш зрілою мовою) є модифікатори доступу, але вони також не перешкоджають фокусам рефлексії.
11684

10

Станом на Xcode 6 beta 4, Swift має модифікатори доступу. З приміток до випуску:

Швидкий контроль доступу має три рівні доступу:

  • приватним особам можна отримати доступ лише з вихідного файлу там, де вони визначені.
  • До внутрішніх об'єктів можна отримати доступ будь-де в межах цілі, де вони визначені.
  • Доступ до державних структур можна отримати з будь-якого місця в межах цілі та з будь-якого іншого контексту, який імпортує модуль поточної цілі.

Неявний замовчуванням є internal, тому в межах цілі програми ви можете залишати модифікатори доступу вимкненими, за винятком випадків, коли ви хочете бути більш обмежуючими. У цільовій рамці (наприклад, якщо ви вбудовуєте рамку для спільного використання коду між додатком і спільним доступом або розширенням перегляду "Сьогодні"), використовуйте publicдля позначення API, який ви хочете викрити для клієнтів своєї рамки.


Що ж, ця відповідь була дійсною в попередній версії Swift, здається, вона більше не відповідає :) Будь ласка, перевірте мою відповідь .
Ахмад Ф

6

Swift 3.0 пропонує п'ять різних елементів контролю доступу:

  1. відчинено
  2. громадські
  3. внутрішній
  4. fileprivate
  5. приватний

Відкритий доступ і відкритий доступ дають можливість об'єктам використовуватись у будь-якому вихідному файлі з їх визначеного модуля, а також у вихідному файлі іншого модуля, який імпортує визначальний модуль. Зазвичай ви використовуєте відкритий або загальнодоступний доступ, коли вказуєте публічний інтерфейс для рамки.

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

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

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

Відкритий доступ - це найвищий (найменш обмежуючий) рівень доступу, а приватний - найнижчий (найбільш обмежуючий) рівень доступу.

Рівні доступу за замовчуванням

Усі об'єкти вашого коду (за кількома конкретними винятками) мають внутрішній рівень доступу за замовчуванням, якщо ви самі не вказали чіткий рівень доступу. Як результат, у багатьох випадках вам не потрібно вказувати чіткий рівень доступу у своєму коді.

Примітка до випуску по темі:

Класи, оголошені загальнодоступними, більше не можна підкласифікувати за межами свого визначального модуля, а методи, оголошені як громадські, вже не можуть бути замінені поза їх модулем визначення. Щоб дозволити класу бути підкласифікованим зовнішньо або методом зовнішнього перекриття, оголосити їх як відкриті, що є новим рівнем доступу поза загальнодоступним. Імпортні класи та методи Objective-C тепер імпортуються як відкриті, а не загальнодоступні. Тестові одиниці, які імпортують модуль за допомогою імпортування @testable, як і раніше дозволять підкласирувати загальнодоступні чи внутрішні класи, а також замінювати загальнодоступні чи внутрішні методи. (SE-0117)

Більше інформації та деталей: Мова програмування Swift (Контроль доступу)


Що ж, ця відповідь була дійсною в попередній версії Swift, здається, вона більше не відповідає :) Будь ласка, перевірте мою відповідь .
Ахмад Ф

4

У бета-версії 6 в документації зазначено, що є три різні модифікатори доступу:

  • Публічний
  • Внутрішня
  • Приватний

І ці три стосуються Класів, Протоколів, функцій та властивостей.

public var somePublicVariable = 0
internal let someInternalConstant = 0
private func somePrivateFunction() {}

Щоб дізнатися більше, перевірте Контроль доступу .


Мав бути захищений модифікатор, який полегшує створення класів з більшою захищеністю.
Кумар C

Що ж, ця відповідь була дійсною в попередній версії Swift, здається, вона більше не відповідає :) Будь ласка, перевірте мою відповідь .
Ахмад Ф

2

Тепер у бета-версії 4 вони додали модифікатори доступу до Swift.

від Xcode 6 beta 4 realese нотатки :

Швидкий контроль доступу має три рівні доступу:

  • private Отримати доступ до об'єктів можна лише з джерела, де вони визначені.
  • internal Суб'єктам можна отримати доступ будь-де в межах цілі, де вони визначені.
  • public Отримати доступ до об'єктів можна з будь-якого місця в межах цілі та з будь-якого іншого контексту, який імпортує модуль поточної цілі.

За замовчуванням більшість об'єктів у вихідному файлі мають внутрішній доступ. Це дозволяє розробникам додатків значною мірою ігнорувати контроль доступу, одночасно дозволяючи розробникам фрейму повністю контролювати API рамки.


Чи можете ви опублікувати посилання на це?
Сніговик

Що ж, ця відповідь була дійсною в попередній версії Swift, здається, вона більше не відповідає :) Будь ласка, перевірте мою відповідь .
Ахмад Ф

2

Механізми контролю доступу, введені в Xcode 6 :

Swift надає три різні рівні доступу для суб'єктів у вашому коді. Ці рівні доступу відносно вихідного файлу, в якому визначена сутність, а також відносно модуля, до якого належить вихідний файл.

  • Загальнодоступний доступ дозволяє особам використовуватись у будь-якому вихідному файлі з їх визначеного модуля, а також у вихідному файлі іншого модуля, який імпортує визначальний модуль. Зазвичай ви користуєтеся загальнодоступним доступом, коли вказуєте загальнодоступний інтерфейс для рамки.
  • Внутрішній доступ дозволяє особам використовуватись у будь-якому вихідному файлі зі свого визначеного модуля, але не у жодному вихідному файлі поза цим модулем. Зазвичай ви користуєтесь внутрішнім доступом, визначаючи внутрішню структуру програми або рамки.
  • Приватний доступ обмежує використання об'єкта власним визначаючим вихідним файлом. Використовуйте приватний доступ, щоб приховати деталі реалізації певного фрагмента функціональності.

Публічний доступ - це найвищий (найменш обмежуючий) рівень доступу, а приватний доступ - найнижчий (або найбільш обмежуючий) рівень доступу.

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

Ще одне моє зауваження, яке коментується у посиланні вище, - це те, що ви не можете "оновити" рівень доступу. Якщо ви підкласируєте щось, ви можете обмежити його більше, але не навпаки.

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


Що ж, ця відповідь була дійсною в попередній версії Swift, здається, вона більше не відповідає :) Будь ласка, перевірте мою відповідь .
Ахмад Ф

2

Swift 3 і 4 принесли багато змін також для рівнів доступу до змінних та методів. У Swift 3 і 4 зараз є 4 різних рівня доступу, де відкритий / відкритий доступ є найвищим (найменш обмежуючим) рівнем доступу, а приватний доступ - найнижчим (найобмежнішим) рівнем доступу:

  • до приватних функцій та членів можна отримати доступ лише в межах самої сутності (структура, клас, ...) та її розширень (у Swift 3 також були обмежені розширення)
  • До функцій файлів і членів файлів можна отримати доступ лише з вихідного файлу, де вони оголошені.
  • До внутрішніх функцій та членів (що за замовчуванням, якщо ви чітко не додаєте ключове слово рівня доступу), можна отримати доступ будь-де в межах цілі, де вони визначені. Ось чому TestTarget не має автоматичного доступу до всіх джерел, вони повинні бути позначені як доступні в інспекторі файлів xCode.
  • відкриті або загальнодоступні функції та члени можуть бути доступні з будь-якого місця в межах цілі та з будь-якого іншого контексту, який імпортує модуль поточної цілі.

Цікаво:

Замість того, щоб позначати кожен метод або член як "приватний", ви можете охопити деякі методи (наприклад, типово допоміжні функції) у розширенні класу / структури та позначити все розширення як "Приватне".

class foo { }

private extension foo {
    func somePrivateHelperFunction01() { }
    func somePrivateHelperFunction02() { }
    func somePrivateHelperFunction03() { }
}

Це може бути хорошою ідеєю для того, щоб отримати краще реконструйований код. І ви можете легко переключитися (наприклад, для тестування одиниць) на приватне, просто змінивши одне слово.

Документація Apple


Що ж, ця відповідь була дійсною в попередній версії Swift, здається, вона більше не відповідає :) Будь ласка, перевірте мою відповідь .
Ахмад Ф

2

Для Swift 1-3:

Ні, це неможливо. Приватних / захищених методів та змінних взагалі немає.

Все публічно.

Оновлення Оскільки Swift 4, в цій темі можна побачити інші відповіді


1
Цей коментар є точним для поточного насіння.
Jesper

2
Для поточного насіння. Це з’явиться в майбутньому .
Джеспер

1
"public" / "protected" / "private" наразі не існує, але ви можете приховати речі, використовуючи закриття, протоколи та внутрішні класи - це робить дещо схожим на шаблон модуля, який зазвичай використовується в JavaScript. Будь ласка, дивіться мій зразок коду в моїй відповіді тут для прикладу того, як це зробити. Якщо я помиляюся про те, як це працює, і мій приклад невірний, будь ласка, вкажіть це, оскільки я все ще вчуся. :)
Дейв Капп

Здається, це вже не дійсно :) будь ласка, перевірте мою відповідь .
Ахмад Ф

1

Один із варіантів, який ви можете використати, - це перетворити створення екземпляра у функцію та подати у конструктор відповідні геттери та задачі:

class Counter {
    let inc: () -> Int
    let dec: () -> Int

    init(start: Int) {
        var n = start

        inc = { ++n }
        dec = { --n }
    }
}


let c = Counter(start: 10)

c.inc()  // 11
c.inc()  // 12
c.dec()  // 11

0

Граматика мови не має ключові слова «громадськості», «приватні» або «захищені». Це дозволило б припустити, що все є публічним. Звичайно, може бути якийсь альтернативний метод визначення модифікаторів доступу без цих ключових слів, але я не зміг знайти його у мовній довідці.


0

Сподіваємось, що заощадите час для тих, хто хоче щось схоже на захищені методи:

Відповідно до інших відповідей, swift надає "приватний" модифікатор - який визначається файлово, а не для класу, як, наприклад, у Java або C #. Це означає, що якщо ви хочете захищені методи, ви можете це зробити за допомогою швидких приватних методів, якщо вони знаходяться в одному файлі

  1. Створіть базовий клас для зберігання "захищених" методів (фактично приватних)
  2. Підклас цього класу для використання тих же методів
  3. В інших файлах ви не можете отримати доступ до методів базового класу, навіть коли ви підклас

наприклад, файл 1:

class BaseClass {
    private func protectedMethod() {

    }
}

class SubClass : BaseClass {
    func publicMethod() {
        self.protectedMethod()  //this is ok as they are in same file
    }
}

Файл 2:

func test() {
    var a = BaseClass()
    a.protectedMethod() //ERROR


    var b = SubClass()
    b.protectedMethod() //ERROR
}

class SubClass2 : BaseClass {
    func publicMethod() {
        self.protectedMethod() //ERROR
    }

}



-2

до swift 2.0 було лише три рівні доступу [Загальнодоступний, внутрішній, приватний], але в swift 3.0 apple додано два нових рівні доступу, які є [Open, fileType], тому зараз у swift 3.0 є 5 рівнів доступу. Тут я хочу очистити роль з цих двох рівнів доступу 1. Відкритий: це багато в чому схоже на Public, але різниця полягає лише в тому, що публіка може отримати доступ до підкласу та змінити, а рівень відкритого доступу не може отримати доступ до того, що це зображення зроблено з веб-сайту Medium, і це описує різницю між відкритим та публічним доступом

Тепер до другого нового рівня доступу 2. Філетип - це більша версія приватного або меншого рівня доступу, ніж внутрішній. Файл файлу може отримати доступ до розширеної частини [класу, структури, перерахунку], а приватний не може отримати доступ до розширеної частини коду, до якого може отримати лише доступ лексичний обсяг цього зображення взято з веб-сайту Medium, і це описує різницю між fileType та приватним рівнем доступу

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