Swift: частный доступ и открытый набор
То, что я нашел до сих пор, - это сценарий публичного доступа и частного набора, как показано ниже.
private(set) var distanceTravelled: Double
Я хочу, чтобы все было наоборот. Конечно, следующее не работает.
private(get) public var distanceTravelled: Double
Ответы
Ответ 1
Если вы хотите публичный сеттер, но частный геттер для этого var, вы можете объявить его закрытым:
private var distanceTravelled: Double
и создать общедоступный метод установки этой переменной:
public func setDistanceTravelled(distanceTravelled: Double) {
self.distanceTravelled = distanceTravelled
}
Ответ 2
Я не считаю, что это возможно. Процитировать из документации:
Вы можете дать сеттеру более низкий уровень доступа, чем соответствующий его получатель
То есть вы можете только изменить доступ в одном направлении, а это значит, что установщик более ограничительный, чем получатель.
Ответ 3
Вам нужно объявить это так:
internal private(set) var distanceTravelled: Double
Ответ 4
Начиная с Xcode 10.2/Swift 5 это возможно путем объединения вычисляемого свойства с атрибутом @available
.
private var internalDistanceTravelled: Double
public var distanceTravelled: Double {
@available(*, unavailable) get { return internalDistanceTravelled }
set(distanceTravelled) { self.internalDistanceTravelled = distanceTravelled }
}
Обратите внимание, что если вы сделаете distanceTravelled
видимым для Objective-C, то unavailable
там unavailable
будет расширяться.
Ответ 5
Вы могли бы сделать что-то вроде этого:
private var _distanceTravelled: Double
var distanceTravelled: Double {
get {
fatalError("Access denied.")
}
set {
_distanceTravelled = newValue
}
}