2017-09-04 1 views
2

Ich habe eine Klasse MyClass von NSObject Unterklasse abgeleitet. Es ist in Objective-C geschrieben. Es verfügt über eine Eigenschaft mit benutzerdefinierten Getter und Setter:Einstellung der Objective-C-Klasse von Swift

@interface MyClass : NSObject 

     @property (getter = getIsBypassEnabled, setter = setIsBypassEnabled:) BOOL isBypassEnabled; 

    @end 

Und diese beiden Funktionen definiert sind in Umsetzung:

@implementation MyClass 

    // Initializer and other stuff 
    // ... 

    - (void) setIsBypassEnabled: (BOOL) newValue 
    { 
     _value = newValue; 
    } 

    - (BOOL) getIsBypassEnabled 
    { 
     return _value; 
    } 

    @end 

Aber wenn ich versuche, die Eigenschaft von Swift zu setzen wie:

let objcClass = MyClass() 
objcClass.isBypassEnabled = true 

Ich bekomme einen Fehler 'isBypassEnabled' has been renamed to 'getIsBypassEnabled'. Aber ich muss den Wert einstellen, nicht bekommen!

Versuch

objcClass.setIsBypassEnabled(true) 

gibt mir einen Fehler, der meine Klasse kein solches Mitglied hat.

Deklarieren

- (BOOL) getIsBypassEnabled; 
- (void) setIsBypassEnabled: (BOOL) newValue; 

explizit in .h-Datei helfen entweder nicht.

Wie behebe ich das Problem? Vielen Dank.

Antwort

3
@interface MyClass : NSObject 
@property (getter = getIsBypassEnabled, setter = setIsBypassEnabled:) BOOL isBypassEnabled; 
@end 

zu Swift als

open class MyClass : NSObject { 
    open var getIsBypassEnabled: Bool 
} 

abgebildet wird, so können Sie die Eigenschaft tatsächlich mit

let objcClass = MyClass() 
objcClass.getIsBypassEnabled = true 

Ich weiß nicht, ob diese Zuordnung oder nicht beabsichtigt ist, möchten Sie vielleicht zu Datei einen Fehlerbericht.

Sie können auch die Swift-Mapping außer Kraft setzen mit

@interface MyClass : NSObject 

@property (getter = getIsBypassEnabled, setter = setIsBypassEnabled:) BOOL isBypassEnabled 
    NS_SWIFT_NAME(isBypassEnabled); 
@end 

und dann

let objcClass = MyClass() 
objcClass.isBypassEnabled = true 

Arbeiten wie vorgesehen.

+0

Die tatsächliche Situation macht überhaupt keinen Sinn, weil sie Eigenschaft und Getter, die nur den gleichen Namen standardmäßig hat, nicht übereinstimmt. Kein Problem, wird repariert, man muss den Code mit der nächsten Version von Swift wieder ändern ... –

Verwandte Themen