我在Swift类中实现Obj-C库中的协议,该类定义了两个属性:
@property (nonatomic, assign, getter = isLoading) BOOL loading;
@property (nonatomic, readonly) UIExpansionStyle expansionStyle;
虽然我不确定如何在Swift课程中符合这些要求。
我看过Obj-C的例子,但我还没有从中收集到任何解决方案。我尝试使用相同的名称声明类变量,但这并没有奏效。关于我将如何处理的任何建议?
PS,有问题的图书馆是https://github.com/OliverLetterer/SLExpandableTableView
答案 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
}
}