【问题标题】:Is there a way to deprecate only the setter of a variable?有没有办法只弃用变量的设置器?
【发布时间】:2018-08-08 22:25:43
【问题描述】:

我目前在 open var deviceIdentifier: String? 类中有一个变量,我想弃用 setter,只将它变成 open private(set) var deviceIdentifier: String?

有没有办法做到这一点?我试图把这两行都放进去,但这显然是 Xcode 不喜欢的冲突。

@available(*, deprecated)
open var deviceIdentifier: String?

open private(set) var deviceIdentifier: String?

如果我将其更改为计算变量,编译器会很高兴,但我想避免这种情况。这是唯一的方法吗?这会按预期工作吗?

private var _deviceIdentifier: String?
open var deviceIdentifier: String? {
    get {
        return _deviceIdentifier
    }
    @available(*, deprecated)
    set(newValue){

    }
}

【问题讨论】:

  • +1 我也想知道是否有解决方案 我快速浏览了一下,找不到任何东西,但它的优先级很低,所以我没有花太多时间它。
  • 如果set-only computed properties 成为可能,那么可以想象getset 声明可以拆分,只允许弃用其中一个。
  • 我认为您的解决方案是使用计算属性。目前最好。一旦我想删除 setter,您就可以将 setter 设为私有。
  • @leogdion 我刚刚测试了计算属性并添加了 @available 注释确实在 Xcode 10 中提供了编译器警告,但在 Xcode 9 中没有。继续前进。

标签: swift model deprecated


【解决方案1】:

目前看来唯一的方法是使用计算变量,但它确实按预期工作。

//TODO: put back to non-computed variable when making set private
private var _deviceIdentifier: String?    
open var deviceIdentifier: String? {
    get {
        return _deviceIdentifier
    }
    @available(*, deprecated)
    set(newValue) {
        _deviceIdentifier = newValue
    }
}

【讨论】:

    【解决方案2】:

    我认为放置private(set) var deviceIdentifier: String?就足够了,当有人试图设置这个变量的值时,编译器会报告这是不可能的。

    【讨论】:

    • deprecated 和 not allowed 之间存在细微差别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多