我正在 Swift 类中实现来自 Obj-C 库的协议(protocol),该类将两个属性定义为:
@property (nonatomic, assign, getter = isLoading) BOOL loading;
@property (nonatomic, readonly) UIExpansionStyle expansionStyle;
虽然我不确定如何在我的 Swift 类中符合这些要求。
我查看了 Obj-C 示例,但我还没有从中收集到任何解决方案。我试过用相同的名称声明类变量,但这没有用。关于我将如何处理这件事有什么建议吗?
PS,有问题的图书馆是https://github.com/OliverLetterer/SLExpandableTableView
最佳答案
我认为你让这件事变得比需要的更难了。使用这样定义的协议(protocol):
@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
前缀 bool getter 是 Cocoa 约定,所以 Swift 已经知道它并且不需要你在 swift 方面做任何特殊的事情。
令人困惑的部分可能是 Objective C 属性声明的所有修饰符。让我们一一分析。
nonatomic
在 Swift 中没有等价物,这里无事可做。
assign
对于值类型是自动的,这里也不需要做任何事情。
getter = isLoading
是一个 Cocoa 约定,Swift 可以理解它并且不需要您提供任何东西来完成这项工作。
readonly
您可以在 Swift 中执行此操作(只需使用 get{ }
语法),但这不是必需的。这是因为您可以扩展协议(protocol)制定的契约(Contract)。 MyProtocol
要求有一个可以读取的名为 expansionStyle
的属性,它确实NOT 表示不能写入该属性在实现协议(protocol)的类型中,就像它没有说您不能在同一个类上拥有其他属性/方法一样。
关于ios - 在 Swift 中符合 Obj-C 协议(protocol)的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27932235/