2015-01-13 38 views
3

我执行从对象 - 库的协议在这两个属性定义为雨燕类:顺应一个OBJ-C协议的属性在斯威夫特

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

虽然我不知道如何符合我的Swift类中的这些要求。

我看过Obj-C的例子,但是我没有收集到任何解决方案。我试过用相同的名称声明类变量,但那没有奏效。关于如何去做这件事的任何建议?

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

+1

有斯威夫特代码,您可以发布?你是否在类声明中声明了协议一致性('class myClass:Superclass,Protocol {// class code here})?你有桥接头来导入SLExpandableTableView.h作为Swift可以看到的Obj-C模块吗? – mc01

回答

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是可可约定。因此,斯威夫特已经知道这件事,也不需要你做快速方面有什么特别之处。

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

nonatomic在Swift中没有等价物,这里没有什么可做的。

assign对于值类型是自动的,这里也没有什么可做的。

getter = isLoading是一个可可约定,斯威夫特理解并且不需要任何东西来完成这项工作。

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

+0

非常感谢修饰符的解释,这非常有帮助。除了init调用,我完全是这样。我有他们的声明强制unwrapped(var loading:Bool!),这似乎导致了这个问题。 – Sam

0

兰斯的回答没有为我工作,这是我得到了isLoading以符合协议(雨燕2.2)

var expansionStyle: UIExpansionStyle = UIExpansionStyle(0) 

var _loading: Bool = false 
var loading:Bool { 
    @objc(isLoading) get { 
     return self._loading 
    } 
    set(newValue){ 
     _loading = newValue 
    } 
}