在Swift中命名Obj-C属性Getters和Setter

时间:2015-09-08 11:19:19

标签: objective-c swift

我正在寻找一种通用的解决方案:

  1. Obj-C 命名属性getter和来自 Swift的命名属性设置器
  2. 符合具有@protocol属性
  3. 的Objective-C readonly

    类似Creating an Objective-C equivalent Getter and Setter in Swift已关闭,但未提供令人满意的答案。

    Objective-C到Swift属性示例:

    我有一个Objective-C协议,定义了两个有问题的属性,一个带有自定义getter isEnabled,另一个带有私有setter exists

    @protocol SomeProtocol <NSObject>
    @property (nonatomic, assign, getter = isEnabled) BOOL enabled;
    @property (nonatomic, readonly) BOOL exists;
    @end
    

    如何从Swift访问这些Objective-C属性?

    这似乎不起作用:

    func isEnabled() -> Bool { return self.enabled }
    

    ,两者都没有:

    var isEnabled:Bool {
        get { }
        set { }
    }
    

1 个答案:

答案 0 :(得分:5)

直接来自documentation

  

使用@objc(&lt;#name#&gt;)属性在必要时为属性和方法提供Objective-C名称。例如,您可以将名为enabled的属性标记为在Objective-C中具有名为isEnabled的getter,如下所示:

     

SWIFT

     

var enabled: Bool { @objc(isEnabled) get { /* ... */ } }

在Swift中命名Objective-C Getter属性

var _enabled:Bool = false
var enabled:Bool {
    @objc(isEnabled) get {
        return self._enabled
    }
    set(newValue){
        _enabled = newValue
    }
}

readonly Swift中的Objective-C属性

<强>要么

var _exists:Bool = false
private(set) var exists:Bool {
    get{
        return self._exists
    }
    set(newValue){
        self._exists = newValue
    }
}

var _exists:Bool = false
var exists:Bool {
    get{
        return self._exists
    }
}

并直接访问self._exists,因为没有setter。