Подтвердить что ты не робот

Частный var доступен извне класса

Это было сделано в Playground, просто для упрощения.

class MyPrivateVar
{
    private var priv: String?
}

var myInstance = MyPrivateVar()

myInstance.priv = "Something"

Нет предупреждений компилятора. Фактически auto-complete показывает priv без проблем. Я понимаю, что вне границ {} класса я не должен видеть ничего частного, func и var.

Я что-то пропустил?

4b9b3361

Ответ 1

Модификаторы доступа в Swift реализованы иначе, чем другие языки. Существует три уровня:

private: доступен только внутри этого файла

internal: доступен только внутри модуля (проекта)

public: доступный из любого места

Если не указано иначе, все, что вы пишете, internal по умолчанию.

В блоге Swift появилась запись об управлении доступом, когда функции были введены в бета-версии 4 и Документация Apple также содержит главу.

Ответ 2

Примечание: этот ответ предназначен для Swift 2


Язык быстрого языка:

Swift предоставляет три разных уровня доступа для объектов внутри вашего код. Эти уровни доступа относятся к исходному файлу, в котором сущность определена, а также относительно модуля, что исходный файл принадлежит.

Если вы не проверили уровень доступа private с помощью Swift, вам может помочь следующий шаг за шагом.

1/Создайте новый проект Xcode.

2/Создайте файл MyPrivateVar.swift и добавьте в него следующий код:

class MyPrivateVar {

    private var priv: String? = nil

}

3/Создайте второй файл MySecondClass.swift и добавьте в него следующий код:

class MySecondClass {

    init() {
        var myPrivateVar = MyPrivateVar()
        myPrivateVar.priv = "some string"
    }

}

Xcode немедленно сообщит вам сообщение об ошибке компилятора Swift:

"MyPrivateVar" не имеет члена с именем "priv"

4/Теперь удалите два предыдущих файла из вашего проекта и создайте один файл TwoClassesInAFile.swift со следующим кодом:

class MyPrivateVar {

    private var priv : String? = nil

}

class MySecondClass {

    init() {
        var myPrivateVar = MyPrivateVar()
        myPrivateVar.priv = "some string"
    }

}

На этот раз вы не получите сообщение об ошибке компилятора Swift, и вы сможете получить доступ к закрытому свойству MyPrivateVar priv из MySecondClass, потому что priv и MySecondClass находятся в одном файле (ваш Файл TwoClassesInAFile.swift).

Кроме того, уровни доступа также работают для глобальных переменных. Например, Xcode не даст никакой ошибки компилятора, если следующий код является частью того же файла ViewController.swift:

import UIKit

private var globalPrivate : String? = nil

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        globalPrivate = "some string"
        println(globalPrivate)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

Однако, если вы определяете globalPrivate вне ViewController.swift, Xcode генерирует сообщение об ошибке:

Использование неразрешенного идентификатора 'globalPrivate'