在 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
}
}
我正在 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.
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
}
}