ios - 在 Swift 中符合 Obj-C 协议(protocol)的属性

标签 ios objective-c swift

我正在 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/

相关文章:

ios - 如何为 segue 引用 NSPredicate 的 "%@"?

ios - 检测 UITextField 内容变化

objective-c - 菜单选项没有改变 - cocoa

ios - 使用 imageFromPDFWithDocumentRef 获取错误的 PDF 缩略图

ios - Swift,代码风格/格式?

swift - SecKeyGeneratePair 给出错误 -4(功能或操作未实现)

iphone指南针根据方向旋转

ios - UINavigationController 图像未在所有 iOS 设备上居中

objective-c - 如何对 Internet 协议(protocol)实现进行单元测试?

ios - 如何获取函数抛出的错误列表?