0

Ich verwende this approach, um meine String-Konstanten zusammen zu halten. Mit dem gleichen Beispiel von dieser Stelle:Prevent takeRetainedValue oder takeUnpenetedValue bei Verwendung eines Objective-C Struct

MONExtResult.h

struct MONExtResultStruct { 
    __unsafe_unretained NSString * const AppID; 
    __unsafe_unretained NSString * const ErrorCode; 
    __unsafe_unretained NSString * const Progress; 
}; 

extern const struct MONExtResultStruct MONExtResult; 

MONExtResult.m

const struct MONExtResultStruct MONExtResult = { 
    .AppID = @"appid", 
    .ErrorCode = @"errorcode", 
    .Progress = @"progress" 
}; 

Das ist wie so in Objective-C verwendet werden kann:

NSString *str = MONExtResult.AppID; 

Wenn ich versuche, es in Swift zu verwenden, aber:

let appID: String = MONExtResult.AppID 

... ich den Fehler:

Cannot convert value of type 'Unmanaged<NSString>!' to expected argument type 'String'

Das ist, weil ich den Wert aus den unmanaged wrapper greifen muß und dann konvertieren in einen String:

let appID: String = MONExtResult.AppID.takeUnretainedValue() as String 

gibt es eine Möglichkeit, das Ziel-C-Code zu annotieren die Notwendigkeit zu verhindern, für den Aufruf takeUnretainedValue wie möglich mit CF_IMPLICIT_BRIDGING_ENABLED oder CF_RETURNS_RETAINED für C-Funktionen?

Aktualisierung: Die Konstanten müssen sowohl von Objective-C als auch von Swift erreichbar sein. Ansonsten würde ich einfach eine Swift Enum mit String Rohwert verwenden.

Antwort

0

Die nächstgelegene ich bauen konnte, ist dies:

enum MONExtResult: String { 
    case AppID = "com.me.myapp" 
    case ErrorCode = "game over" 
    case Progress = "vote Tuesday" 
} 

extension String { 
    init(const: MONExtResult) { 
     self = const.rawValue 
    } 
} 

let err = String(MONExtResult.ErrorCode) 

Es ist erwähnenswert, dass dies nicht funktioniert:

let appID: String = MONExtResult.AppID 

mangels .rawValue am Ende, aber so lange Da Sie bereit sind, ungefähr die gleiche Anzahl von Zeichen und eine etwas andere Syntax zu akzeptieren, glaube ich, dass dies das tut, was Sie vorhatten.

+0

Eine der Anforderungen ist, dass es eine Objective-C-Struktur bleiben muss, da ich es sowohl in Objective-C als auch in Swift verwenden muss. Wenn ich das Enum in Swift erstelle, ist es in Objective-C-Code aufgrund des Rohwerts nicht zugänglich. – Senseful

+0

Bitte geben Sie mir ein Beispiel, wie Sie es verwenden möchten Objective-C – Feldur

+0

Was passiert auch, wenn Sie einfach alle unsicheren, nicht vorhandenen Anmerkungen entfernen? – Feldur