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

时间:2015-01-13 21:57:16

标签: ios objective-c swift

我在Swift类中实现Obj-C库中的协议,该类定义了两个属性:

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

虽然我不确定如何在Swift课程中符合这些要求。

我看过Obj-C的例子,但我还没有从中收集到任何解决方案。我尝试使用相同的名称声明类变量,但这并没有奏效。关于我将如何处理的任何建议?

PS,有问题的图书馆是https://github.com/OliverLetterer/SLExpandableTableView

2 个答案:

答案 0 :(得分:2)

我认为你正在努力实现这一目标。使用如下定义的协议:

@protocol MyProtocol

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

@end

以下类符合:

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

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

使用is对布尔getter进行前缀是一个Cocoa约定,因此Swift已经知道它,并且不要求你在swift方面做任何特别的事情。

令人困惑的部分可能是Objective C属性声明的所有修饰符。让我们一个接一个地浏览它们。

nonatomic在Swift中没有相应的东西,这里没什么可做的。

assign对于值类型是自动的,也不在此处。

getter = isLoading是一个Cocoa约定,Swift理解并且不需要你为此工作。

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

答案 1 :(得分:0)

Lance的回答对我不起作用,这就是我得到的方法是遵守协议(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
    }
}