2015-01-13 34 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 
    } 
}