2014-09-28 86 views
18

具有物C基類訪問Objective-C的基類的實例變量:從雨燕類

@interface ObjcClass : NSObject { 
    NSString *aVariable_; 
} 

而且迅速的子類:

class SwiftClass : ObjcClass { 
    func init() { 
     // aVariable_ can't be accessed here. An Objective-c derived 
     // class has direct access to it's super's instance variables! 
    } 
} 

如何從訪問ObjcClassaVariable_SwiftClass

回答

5

我找不到一個「正確」的方式來做到這一點,但我非常需要它的工作。我的解決辦法是我的目標C超類創建一個簡單的getter方法,是這樣的:在實現文件

- (NSString *)getMyVariable { 
    return myVariable; 
} 

頭文件

@interface ObjcClass : NSObject { 
    NSString *myVariable; 
} 
- (NSString *)getMyVariable; 


我喜歡聽到更好的做法,但這至少起作用。

+1

我建議名詞形式' - (的NSString *)myVariable'。按照慣例,當通過引用返回結果時,通常使用「get」前綴(例如'NSArray'的' - (void)getObjects:(id [])緩衝區範圍:(NSRange)range')。更好的是,使用其他答案建議的屬性。 – 2014-11-08 23:05:04

17

偉大的查詢。我們努力完成這項工作。唯一的工作解決我用用self.setValue("New Value", forKey: "aVariable_")

希望幫助self.valueForKey("aVariable_")

設定值時發現

獲取價值。可能的解決方案,而不會改變超類。

+0

這就是我所做的。儘管我喜歡@ JasonTyler的回答。 – Shai 2014-10-15 10:35:48

+0

感謝@Narendra對於我來說,我更喜歡這種方式,如果讓var aVar = self.valueForKey(「aVariable_」)就好像您的代碼在Swift中一樣,並且您使用的是不能修改的Objective C庫。很棒。 – Dam 2015-05-28 09:09:27

+0

這是最簡單的方法,即使是類型檢查的湖泊。 – 2016-11-26 15:28:25

3

我已經爲此搜尋了很多。

@interface PrjRec : NSObject { 
    @public 
    NSString* name; 
} 
@end 

要:

@interface PrjRec : NSObject { 
} 

@property NSString* name; 

@end 

類似@JasonTyler解決方案 最後,我從我的代碼更改。 然後,我可以從簡單的點符號<object instance>.name斯威夫特代碼訪問我的對象的屬性,

但我需要從改變所有現有的Objective-C的引用

<object instance>->name 

要:

<object instance>.name 

_name 

如果是內部單元。

我希望有更好的解決方案。

0

如果您願意擁有一個房產,那麼您可以創建該房產以適應您的需求。

@interface ObjcClass : NSObject { 
    NSString *aVariable_; 
} 

@property (nonatomic) NSString *aVariable_; 

...

@implementation ObjcClass 

@synthesize aVariable_ = aVariable_; 

這使得可變作爲inst->aVariable_或作爲inst.aVariable_進行訪問。在Objective C類中,變量可以被訪問爲aVariable_self.aVariable_

0

我真的不知道爲什麼有人不再爲實例變量(比如默認情況下它們是私有的)和屬性。看到Giorgio Calzolato對此的回答(除了最後一行關於尋找更好的解決方案 - 這是最好的解決方案:))。

在我的情況下,我已經有一個屬性,併爲什麼它不工作額外困惑。但我意識到該屬性有一個自定義時間,它需要被添加到我的SDK-Bridging-Header.h文件中。

所以如果你的屬性設置爲自定義類型是這樣的:

@property (nonatomic, weak) IBOutlet SDKMyCustomObject *customObject; 

...然後記得將它添加到橋接頭。

1

這個工作對我來說是非常簡潔的解決方案,只是增加像雨燕變量:

var myInstanceVar: String { 
    return self.value(forKey: "myInstanceVar") as! String 
}