Частный var доступен извне класса
Это было сделано в Playground, просто для упрощения.
class MyPrivateVar
{
private var priv: String?
}
var myInstance = MyPrivateVar()
myInstance.priv = "Something"
Нет предупреждений компилятора. Фактически auto-complete показывает priv
без проблем.
Я понимаю, что вне границ {} класса я не должен видеть ничего частного, func
и var
.
Я что-то пропустил?
Ответы
Ответ 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'