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
  }
}