在 Swift 中符合 Obj-C 协议的 属性

Conforming to an Obj-C protocol's property in Swift

我正在 Swift class 中实现来自 Obj-C 库的协议,该协议将两个属性定义为:

@property (nonatomic, assign, getter = isLoading) BOOL loading;
@property (nonatomic, readonly) UIExpansionStyle expansionStyle;

尽管我不确定如何在我的 Swift class 中符合这些要求。

我查看了 Obj-C 示例,但我还没有从中收集到任何解决方案。我试过用相同的名称声明 class 变量,但这没有用。关于我将如何处理这件事有什么建议吗?

PS,有问题的库是 https://github.com/OliverLetterer/SLExpandableTableView

我认为你让这件事变得比需要的更难了。使用这样定义的协议:

@protocol MyProtocol

@property (nonatomic, assign, getter = isLoading) BOOL loading;
@property (nonatomic, readonly) UIExpansionStyle expansionStyle;

@end

以下class符合:

class Conformer : MyProtocol {
    var loading: Bool
    var expansionStyle: UIExpansionStyle

    init(loading: Bool, expansionStyle: UIExpansionStyle) {
        self.loading = loading
        self.expansionStyle = expansionStyle
    }
}

使用 is 前缀布尔 getters 是一个 Cocoa 约定,所以 Swift 已经知道它并且不需要你在 swift 上做任何特殊的事情边.

令人困惑的部分可能是 Objective C 属性 声明的所有修饰符。让我们一一过一遍。

nonatomic 在 Swift 中没有对应项,此处无事可做。

assign对于值类型是自动的,这里也没什么可做的。

getter = isLoading 是一个 Cocoa 约定,Swift 理解并且不需要您提供任何东西来完成这项工作。

readonly 可以 在 Swift 中执行此操作(只需使用 get{ } 语法),但这不是必需的。这是因为您可以扩展协议制定的合同。 MyProtocol 要求有一个名为 expansionStyle 的 属性 可以从中读取,它 NOT 表示一定不能写入属性 在实现协议的类型中,就像它没有说你不能在同一个 class.

上有其他 properties/methods

Lance 的回答对我不起作用,这就是我如何让 isLoading 符合协议 (Swift 2.2)

var expansionStyle: UIExpansionStyle = UIExpansionStyle(0)

var _loading: Bool = false
var loading:Bool {
    @objc(isLoading) get {
        return self._loading
    }
    set(newValue){
        _loading = newValue
    }
}